? ? ?開發(fā)中總有一些細枝末節(jié)的東西是容易出錯的地方,搜集總結下,避免再次掉入坑中。
1.UISearchBar? &? UISearchDisplayController;
? @interface? UISearchDisplayController :NSObject? ? ,UISearchDisplayController看似是一個ViewController ?其實不是,而且它會影響系統(tǒng)的導航條設置。 ?
@property(nonatomic,assign) BOOL ?displaysSearchBarInNavigationBar ? 可以把搜索條放到導航條上
@property(nullable,nonatomic,readonly) UINavigationItem ? *navigationItem ?
active=NO; ? ? 該屬性為YES 的時候,searchBar ?處于點擊后待輸入的搜索編輯狀態(tài)(有鍵盤彈出)。為 NO時,就是初始化的靜止狀態(tài)。
? ? 當隱藏系統(tǒng)的導航條,使用自定義的導航條的時候(一個自定義的View,當初是因為設置導航條的顏色,RGB值相同時,導航條顏色比較淺,所以就使用自定義的導航條)。點擊搜索后,停止編輯后,系統(tǒng)的單航條就會出現(xiàn),而且通過代理來手動隱藏是無法做到的,所以,在使用? UISearchBar & UISearchDisplayController時不要使用自定義的導航條,最好是使用系統(tǒng)原來的。。使用UISearchBar & UISearchDisplayController時就會有那個點擊搜索框后,試圖上移的效果,若是不使用UISearchDisplayController單單使用UISearchBar 就不會有那個效果了。
2. UIDatePicker
這個時間選擇器的顯示,會隨著手機的語言設置而不同,對于用模擬器的小伙伴,默認的顯示樣式是英文的,當把模擬器的語言設置成簡體中文時就變成這樣了

_datePicker= [[UIDatePickeralloc]init];
_datePicker.tag=101;
_datePicker.datePickerMode=UIDatePickerModeDate;
[self.viewaddSubview:_datePicker];
- (IBAction)clicked:(id)sender {
// 獲取用戶通過UIDatePicker設置的日期和時間
NSDate *selected = [self.datePicker date];
// 創(chuàng)建一個日期格式器
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// 為日期格式器設置格式字符串
[dateFormatter setDateFormat:@"yyyy年MM月dd日 HH:mm +0800"];
// 使用日期格式器格式化日期、時間
NSString *destDateString = [dateFormatter stringFromDate:selected];
NSString *message =? [NSString stringWithFormat:
@"您選擇的日期和時間是:%@", destDateString];
}
3.關于for 循環(huán) ?與 全局變量
? ? ? ?以前對于有規(guī)律的UI布局喜歡用for循環(huán),但是遇到 這些 控件都是全局變量,后續(xù)需要設置的情況下就放棄了 ?For循環(huán),轉而一個個地去實現(xiàn),其實我們大可以繼續(xù)使用for 循環(huán),在循環(huán)中生成一個局部變量,把這個局部變量設置好,加載上,最后對于不同的 i 下把這個局部變量的指針賦值給 對應的全局變量 即可。。很是方便。
? ? 還有一個更方便的方法聲明一個有固定存儲空間的變量集,如 UIImageView*imageV[3];這樣就可以方便的找到你想要的那些變量啦,一次聲明,各種使用,比較省事。
4.? nil 、Nil、和NULL
nil是一個對象指針為空,Nil是一個類指針為空,NULL是基本數(shù)據(jù)類型為空。對于像NSArray這樣的類型,nil或NULL不能做為加到其中的Object,如果定義了一個NSArray,為其分配了內存,又想設置其中的內容為空,則可以用[NSNULL null返回的對對象來初始化NSArray中的內容。
5.觀察者模式
? ? ? 觀察者Observer,一般繼承自NSObject,通過NSNotificationCenter的addObserver:selector:name:object接口來注冊對某一類型通知感興趣.在注冊時候一定要注意,NSNotificationCenter不會對觀察者進行引用計數(shù)+1的操作,我們在程序中釋放觀察者的時候,一定要去報從center中將其注銷了,
?因為 NSNotificationCenter是一個全局的單例,不注銷的話機會造成 crash?
調用方法是里:
object : 被觀察對象
observer: 觀察對象
forKeyPath里面帶上property的name,如UIView的frame、center等等
options: 有4個值,分別是:
NSKeyValueObservingOptionNew 把更改之前的值提供給處理方法
NSKeyValueObservingOptionOld 把更改之后的值提供給處理方法
NSKeyValueObservingOptionInitial 把初始化的值提供給處理方法,一旦注冊,立馬就會調用一次。通常它會帶有新值,而不會帶有舊值。
NSKeyValueObservingOptionPrior 分2次調用。在值改變之前和值改變之后。
注:例子里的0就代表不帶任何參數(shù)進去
context:需要傳遞的對象是一個(void *)類型的數(shù)據(jù),這是一個C類型的對象 可以帶入一些參數(shù),其實這個挺好用的,任何類型都可以,自己強轉就好了。 如 (void *)@"xixi"? 就可以作為一個 context 參數(shù)。
context的巧用:KVO的一種缺陷(其實不能稱為缺陷,應該稱為特性)是,當對同一個keypath進行兩次removeObserver時會導致程序crash,這種情況常常出現(xiàn)在父類有一個kvo,父類在dealloc中remove了一次,子類又remove了一次的情況下。不要以為這種情況很少出現(xiàn)!當你封裝framework開源給別人用或者多人協(xié)作開發(fā)時是有可能出現(xiàn)的,而且這種crash很難發(fā)現(xiàn)。
? ? ? ? ? 我們可以分別在父類以及本類中定義各自的context字符串,比如在本類中定義context為@"ThisIsMyKVOContextNotSuper";然后在dealloc中remove observer時指定移除的自身添加的observer。這樣iOS就能知道移除的是自己的kvo,而不是父類中的kvo,避免二次remove造成crash。
6.陰影效果不出來?漏東西了
_imageView.layer.shadowColor = [UIColor blackColor].CGColor;//shadowColor陰影顏色
_imageView.layer.shadowOffset?=?CGSizeMake(4,4);//shadowOffset陰影偏移,x向右偏移4,y向下偏移4,默認(0,?-3),這個跟shadowRadius配合使用
_imageView.layer.shadowOpacity?=?0.8;//陰影透明度,默認0 ? ?容易遺忘
_imageView.layer.shadowRadius?=?4;//陰影半徑,默認3
7.對于一些UI控件的樣式和功能的了解
對于這些UI基礎特性的了解多少,將決定著布局頁面的時地思路。比如
只有UILabel? 有對行數(shù)的設置。?
UITextView 無法設置單行輸入,當輸入的內容超過當前行的長度時就會自動換行,使用回車鍵也可以達到換行的效果。當內容大小超出了當前的Frame ?就可以滾動。
UITextField? 無法設置多行輸入
8.日期格式的設置細節(jié)(不帶0)
d ?將日顯示為不帶前導零的數(shù)字(如 1)。如果這是用戶定義的數(shù)字格式中的唯一字符,請使用 %d。
dd ?將日顯示為帶前導零的數(shù)字(如 01)。
EEE ?將日顯示為縮寫形式(例如 Sun)。
EEEE ?將日顯示為全名(例如 Sunday)。
M ?將月份顯示為不帶前導零的數(shù)字(如一月表示為 1)。如果這是用戶定義的數(shù)字格式中的唯一字符,請使用 %M。
MM ?將月份顯示為帶前導零的數(shù)字(例如 01/12/01)。
MMM ? 將月份顯示為縮寫形式(例如 Jan)。
MMMM 將月份顯示為完整月份名(例如 January)。
gg 顯示時代/紀元字符串(例如 A.D.)
h 使用 12 小時制將小時顯示為不帶前導零的數(shù)字(例如 1:15:15 PM)。如果這是用戶定義的數(shù)字格式中的唯一字符,請使用 %h。
hh 使用 12 小時制將小時顯示為帶前導零的數(shù)字(例如 01:15:15 PM)。
H ?使用 24 小時制將小時顯示為不帶前導零的數(shù)字(例如 1:15:15)。如果這是用戶定義的數(shù)字格式中的唯一字符,請使用 %H。
HH 使用 24 小時制將小時顯示為帶前導零的數(shù)字(例如 01:15:15)。
m ?將分鐘顯示為不帶前導零的數(shù)字(例如 12:1:15)。如果這是用戶定義的數(shù)字格式中的唯一字符,請使用 %m。
mm ?將分鐘顯示為帶前導零的數(shù)字(例如 12:01:15)。
s ?將秒顯示為不帶前導零的數(shù)字(例如 12:15:5)。如果這是用戶定義的數(shù)字格式中的唯一字符,請使用 %s。
ss ?將秒顯示為帶前導零的數(shù)字(例如 12:15:05)
M/d/yyyy H:mm ? ? ?12/7/1958 20:50
9.Xcode8 控制臺亂碼輸出:
Xcode8里邊 Edit Scheme-> Run -> Arguments, 在Environment Variables里邊添加 OS_ACTIVITY_MODE = Disable 環(huán)境變量即可。

10.AppID賬戶信息是可以修改的



