這是一個讓我有點bat and的東西,而且我的眼睛正在黯然失色。在iOS中加載視圖時發生的事件順序
我有一個導航控制器的應用程序。
查看A具有一些輸入字段和「繼續」按鈕,它加載視圖B
當我輕觸導航控制器其導致事件的左上角的「返回」按鈕的順序被解僱我「M沒有料到/理解
我的跟蹤顯示...
View B: viewWillDisappear
View A: viewWillAppear
View B: textFieldShouldEndEditing
編輯 - 更詳細/代碼解釋我以前模糊的問題
從概念上講,以下方法一直運行良好,並通過了多輪QA測試。
總之,我正在使用textFieldShouldEndEditing
來驗證文本字段。如果他們無效,我會保持對該領域的關注,並向他們展示什麼是錯誤的信息。一切都很好,驗證工作可以在用戶嘗試從一個領域到另一個領域之間進行。
下面的代碼有問題的情況是,如果有人輸入部分值,然後單擊BACK。整個應用程序中的所有UITextFields
凍結(不允許輸入),並且在某些情況下應用程序崩潰。
我試圖讓我發佈初始問題的方法是創建一個private:BOOL isDisappearing;
,我可以在viewWillDisappear
檢查(在大多數情況下火災之前textFieldShouldEndEditing),如果它是的,我會短路被燒成和凍結UITextFields /應用程序有問題的代碼。
這是工作在幾個視圖罰款,但在'視圖A:viewWillAppear'事件之前觸發textFieldShouldEndEditing
下面(視圖B) - isDisappearing設置爲'NO'以某種方式和有問題的代碼是在射擊textFieldShouldEndEditing
我希望這可以幫助,你可以按照。我發現很難解釋沒有代碼 - 但我試圖把它縮小到恰恰相關。我希望這裏適合 - 我對社區很新。
代碼VIEW B:
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)rangereplacementString:(NSString *)string
{
// Enforce max lengths
// The return key from the keyboard counts as a character, so we have to exempt it
if (textField.tag == ROUTING_NUMBER_TAG)
{
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return (newLength > 9 && ![string isEqualToString:@"\n"]) ? NO : YES;
}
else if (textField.tag == ACCOUNT_NUMBER_TAG)
{
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return (newLength > 17 && ![string isEqualToString:@"\n"]) ? NO : YES;
}
return YES;
}
// textField validation
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
if (isDisappearing)
return YES;
//run fields through validators and display validation messages.
//IF THEY DON’T PASS VALIDATION IM "HOLDING THEM HOSTAGE" BY KEEPING THE FOCUS ON THE UITEXTFIELD (returning NO)
if (textField.tag == ROUTING_NUMBER_TAG)
{
if ([Utility isValidRoutingNumber:textField.text]== NO)
{
[[iToast makeText:NSLocalizedString(@"Enter valid routing number", @"")] show];
return NO;
}
else
{ //save it
extension.payment.routingNumber = routingNumber.text;
}
}
else if (textField.tag == ACCOUNT_NUMBER_TAG)
{
if ([Utility isValidAccountNumber:textField.text] == NO)
{
[[iToast makeText:NSLocalizedString(@"Enter valid account number", @"")] show];
return NO;
}
else
{ //save it
extension.payment.accountNumber = accountNumber.text;
}
}
return YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
//I do nothing here except nulling out the 'activefield' var I use to autoscroll the uiscrollview as the user taps around from field to field
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//reset the bool so that when they come back we're back to the 'normal' state and validation will again be checked in textFieldShouldEndEditing
isDisappearing = NO;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
-(void)viewWillDisappear:(BOOL)animated
{
TRC_ENTRY
//set the bool to bypass validations in textFieldShouldEndEditing
isDisappearing = YES;
[super viewWillDisappear:animated];
}
只是意外地提出我的意見過早。讓我再試一次......我的問題似乎是UITextFieldDelate相關事件以意想不到的方式發射。我確信有一個合乎邏輯的原因,但在某些情況下,textFieldShouldEndEditing * only *在UITextField具有焦點時單擊NavController「返回」按鈕時觸發。我的代碼在這種情況下工作。我剛剛發現textFieldDidEndEditing也在我遇到問題的情況下發射。我現在試圖弄清楚爲什麼DID在這個特定的情況下發射,但不是其他人。 – jaySF 2012-03-06 01:15:56
@jayboston'-textFieldShouldEndEditing:'應該在文本字段即將放棄其「第一響應者」狀態時調用。因此,如果您點擊不同的文本字段,或者執行其他任何可以使文本字段不再成爲第一響應者的地方,則應該調用當前的焦點文本字段。這顯然包括點擊「後退」按鈕,因爲這將取代大部分響應者鏈,包括第一響應者。當文本字段確實停止爲第一響應者時,你有沒有調用'-textFieldDidEndEditing:'不* *的情況? – Caleb 2012-03-06 01:43:28
@jayboston此外,請記住,如果您有多個具有相同代表的文本字段,該對象將接收所有文本字段的消息。所以你可能會得到一個字段的「-textFieldShouldBeginEditing:」和一個不同的字段或其他組合的「-textFieldDidEndEditing:」,而不一定按照這個順序。密切關注'sender'參數。 – Caleb 2012-03-06 01:46:28