我現在有一個正在運行的應用程序,但是我遇到了很大的絆腳石。該應用程序具有標籤欄控制器(TB)的前提,該標籤欄控制器具有兩個標籤,每個標籤中包含一個表格視圖。表格視圖1(TV1)由用戶單擊導航欄中的加號按鈕並填寫名稱和事件文本字段並從日期選擇器中選擇一個日期來填充。表格視圖2是用戶創建的每個獨特事件的圖示。表1按時間順序顯示每項交易,表2僅顯示唯一事件名稱,以便您可以按事件查看交易。當NSDateFormatter與NSString和NSDate一起使用時,NSDate語言環境導致其他語言環境問題
我正在使用核心數據和NSFetchedResultsControllers將所有東西綁在一起。
這工作得很好,但我期待介紹一個更新。
如果用戶點擊表2並看到例如週年紀念,生日和婚禮等事件,然後點擊說生日,他們將看到事件=生日(所選活動場景)的所有交易, 。我在這裏放置了一個新的導航欄按鈕(選定的事件),以允許用戶添加一個新的條目,其中包含已從選定事件填充的日期和事件。
我有這95%的工作。問題歸結爲NSLocales和日期格式化程序。
我會在這裏把一些代碼,然後談談這個問題:
在添加條目,該NSCalendar日期和日期選擇是:
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
// Will explain the commented out lines
//NSLocale *brLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
//[cal setLocale:brLocale];
NSDateComponents *components = [cal components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit
fromDate:self.datePicker.date];
[components setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSDate *selectedDate = [cal dateFromComponents:components];
此更新程序之前,我沒在這段代碼中有locale(註釋掉的代碼),因爲它只是使用設備本地,並且工作得很好。現在我必須添加它才能使下一部分工作。
在選定事件控制器,該prepareForSegue是:
if ([segue.identifier isEqualToString:@"Create New Entry From Event"])
{
AddEntryViewController *addEntryViewController = (AddEntryViewController *)segue.destinationViewController;
[addEntryViewController setSelectedEvent:self.occasion.title];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0] ;
NSString *sectionTitle = [self tableView:self.selectedOccasionTableView titleForHeaderInSection:indexPath.section];
NSLog(@"The section header is: %@", sectionTitle);
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMMM d, yyyy"];
NSDate *dateFromString = [[NSDate alloc] init];
dateFromString = [dateFormatter dateFromString:sectionTitle];
NSLog(@"The new date is %@", [dateFormatter stringFromDate:dateFromString]);
[addEntryViewController setSelectedDate:dateFromString];
[addEntryViewController setIsFromSelectedEvent:YES];
}
我從章節標題獲得日期和發送該到添加條目,其中:
- (void)setSelectedDate:(NSDate *)selectedDate
{
_selectedDate = selectedDate;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.occasionTextField.text = self.selectedEvent;
if (self.isFromSelectedEvent)
{
NSLog(@"This gets run");
[self.datePicker setDate:self.selectedDate animated:YES];
}
}
問題我遇到的情況是 - 如果設備語言環境設置爲除美國語言環境之外的任何設備(代碼未在上面註釋),則應用程序會崩潰。當然這不可取。
很多努力已經進入讓這個應用程序使用這種格式的日期,我不能改變這一點,因爲很多是依賴節標題中的日期。
我需要一種方法來調整prepareForSegue中的NSDateFormatter代碼,以考慮設備正在使用的任何格式。
下面的代碼將NSDate轉換爲NSString,因此它在節標題中是可讀的,但這裏是問題所在。
-(NSString *)sectionDateFormatter
{
return [NSDateFormatter localizedStringFromDate:self.dates.dateOfEvent
dateStyle:NSDateFormatterLongStyle
timeStyle:NSDateFormatterNoStyle];
}
如果用戶正在使用美國語言環境,則日期將顯示爲月份日期,年份。如果用戶使用的是英國語言環境,那麼它將是Date Month Year。
我需要以某種方式解決這個問題。我需要:
1)將NSDate/NSString的語言環境設置爲一種特定的格式,而不管語言環境如何,或者2)操作代碼以支持所有潛在的語言環境。
數字1似乎更容易,但我不知道如何實現這一點。如果你使用它,我需要這個應用程序不會崩潰。
如果您使用的是英國的語言環境,它與崩潰:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: date'
我需要一種方法來堅持一種格式,無論您身在何處的。例如,我很樂意將格式設置爲「日期月,年」,而不管您是在美國並使用美國語言環境,還是在新加坡使用新加坡語言環境。
任何想法在正確的方向將在這裏認真讚賞。
我不知道如果我理解你發佈什麼,但爲什麼不能在內部存儲一個正常的NSDate對象和工作。顯示然後可以是任何東西--- – Volker
謝謝@Volker - NSDate對象已經存儲在CoreData作爲一個屬性..節標題必須轉換爲NSString,所以它顯示爲用戶乾淨的節標題。我將如何去實現你提到的內容?再次感謝你的回覆。 要求是 - 我需要NSDate出來的NSDatePicker是獨立的區域設置,並設置一個類似日期月,年的格式,無論您的設備上使用什麼區域設置 – amitsbajaj
你應該能夠在日期格式化程序中定義自己的格式。像[dateFormatter setDateFormat:@「MMMM dd,yyyy」];或任何你最喜歡的東西 – Volker