1. 程式人生 > >iOS開發筆記之四十三——日曆NSCaledar使用過程中遇到的一個蘋果系統bug

iOS開發筆記之四十三——日曆NSCaledar使用過程中遇到的一個蘋果系統bug

    我們的app上有一個時間日曆,早期的需求只考慮到app在國內使用。在國內時,NSCaledar這個方法的使用一切正常,後來業務要擴大到國外各地。NSCaledar就暴露了一個問題,這個問題直接導致了我們日曆頁面的卡死。我們忽略掉所有的繁文縟節,直接進入問題的根源。

(1)NSCaledar的初始化,取得當前使用者的邏輯日曆如下:

_calender = [NSCalendar currentCalendar];
並且我們需要獲取“每週第一天是幾”這個數值,即_calender.firstWeekday的值。我們知道這個firstWeekday值如果未經手動設定,就會返回預設值1,也就是每週的第一天是週日,每週的第一天是週日。如果你要設定每週第一天是星期一,那麼就用下面的方法設為2:
- (void)setFirstWeekday:(NSUInteger)value;

當所有的值都是預設值,使用者的手機也採取預設設定時,一切是ok的。問題就在於使用者的手機設定是千變萬化的。

(2)當用戶更改“設定-通用-語言與地區-地區”,改為例如“阿爾及利亞”這種比較偏僻的地區時,問題就來了,此時_calender.firstWeekday的返回值就會變化。可能為2,可能為其他值,取決於你的地區設定。有人感到奇怪,每週的第一天預設是週日也就是1,為何會有其他的返回值。猜想有兩個原因:第一,在哪個地區的預設每週的第一天就不是1,(可能性比較小,也暫時沒法考證);第二,就是蘋果_calender.firstWeekday這個返回有誤。建議在使用時,要注意這一點。我在開發中,直接用1來替代了_calender.firstWeekday的返回值。