實踐-小細節(jié) Ⅰ

? ? ?開發(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賬戶信息是可以修改的




最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • longaaaa =14200666; Console.WriteLine(aaaa.ToString("N0")...
    魚落于天閱讀 1,049評論 0 1
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,330評論 0 17
  • java實現(xiàn)生產(chǎn)者非常簡單,可以直接使用kafka-clients包,也可以使用spring-kafka這樣的框架...
    赱赱_fddd閱讀 681評論 0 0
  • 我發(fā)現(xiàn)我并不擅長記錄事情,剛才寫了不少,忽然發(fā)現(xiàn)自己總是越扯越遠,把一開始想說的都忘記了,每寫一點思路也跟著往前跑...
    uucloud閱讀 231評論 0 1

友情鏈接更多精彩內容