[英]iOS app device test with iOS 4.3, 4.2, 4.1, 4.0, 5.0, iOS
[英]Why is resignFirstResponder being called twice in iOS 5.0 but only once in iOS4.2-4.3?
我在App Store中為4.2編譯了一個在iOS 5.0下運行時表現奇怪的應用程序。 我已將其跟蹤到resignFirstResponder
在iOS 5.0下被調用兩次,而它只在iOS 4.2和4.3下被調用一次。
我從UITextField
派生了一個類,我重寫了resignFirstResponder
。 請參閱下面的示例代碼。
在iOS 4.2和4.3下,我在控制台中看到以下內容:
textFieldShouldReturn
resignFirstResponder
textFieldDidEndEditing
在iOS 5.0下,我在控制台中看到以下內容:
textFieldShouldReturn
resignFirstResponder
resignFirstResponder
textFieldDidEndEditing
在設備和模擬器上運行代碼可以獲得持續的結果。 我錯過了什么或這是一個錯誤嗎?
#0 -[BugTextField resignFirstResponder] (self=0x681b530, _cmd=0x3769b41) at /Users/.../BugTextField.m:14
#1 0x006c05a6 in -[UIFieldEditor resignFirstResponder] ()
#2 0x006374e3 in -[UIView(Hierarchy) _willMoveToWindow:] ()
#3 0x006362c2 in __UIViewWillBeRemovedFromSuperview ()
#4 0x006360d7 in -[UIView(Hierarchy) removeFromSuperview] ()
#5 0x006bfff7 in -[UIFieldEditor becomeFieldEditorForView:] ()
#6 0x006ae37b in -[UITextField _resignFirstResponder] ()
#7 0x006eb8d4 in -[UIResponder _finishResignFirstResponder] ()
#8 0x006eba20 in -[UIResponder resignFirstResponder] ()
#9 0x006ae249 in -[UITextField resignFirstResponder] ()
#10 0x00017f68 in -[BugTextField resignFirstResponder] (self=0x681b530, _cmd=0x3769b41) at /Users/.../BugTextField.m:16
#11 0x0001828f in -[BugTextFieldVC textFieldShouldReturn:] (self=0x6829750, _cmd=0x18c5b, textField=0x681b530) at /Users/.../BugTextFieldVC.m:40
#import <UIKit/UIKit.h>
@interface BugTextField : UITextField
@end
#import "BugTextField.h"
@implementation BugTextField
- (BOOL) resignFirstResponder
{
NSLog(@"resignFirstResponder");
return [super resignFirstResponder];
}
@end
#import <UIKit/UIKit.h>
@class BugTextField;
@interface BugTextFieldVC : UIViewController <UITextFieldDelegate> {
BugTextField *bugTextField;
}
@end
#import "BugTextFieldVC.h"
#import "BugTextField.h"
@implementation BugTextFieldVC
- (id) init
{
if ( !(self = [super init]) )
{
return self;
}
// One text field with 100 height keyboard
bugTextField = [[BugTextField alloc] initWithFrame:CGRectMake(10, 10, 300, 30)];
bugTextField.borderStyle = UITextBorderStyleRoundedRect;
bugTextField.delegate = self;
[self.view addSubview:bugTextField];
return self;
}
- (void) dealloc
{
[bugTextField release];
[super dealloc];
}
- (BOOL) textFieldShouldReturn:(UITextField *)textField
{
NSLog(@"textFieldShouldReturn");
[textField resignFirstResponder];
return YES;
}
- (void) textFieldDidEndEditing:(UITextField *)textField
{
NSLog(@"textFieldDidEndEditing");
}
@end
下面是一個適用於iOS 4.2,4.3和5.0的解決方案。它不是火箭科學也不是性感的,但它會起作用,直到我更好地理解發生了什么(我做錯了什么或這是一個錯誤?) 。 我將此報告為Apple的錯誤。
#import <UIKit/UIKit.h>
@interface BugTextField : UITextField {
// Value used to ensure code in resignFirstResponder is executed by the
// first stack frame and not subsequent stack frames in iOS 5.0.
//
// In iOS 5.0, one call to resignFirstResponder results in a second call to
// resignFirstResponder. In iOS 4.2 & 4.3, one call to resignFirstResponder
// does not result in subsequent calls to resignFirstResponder.
NSUInteger resignFirstResponderCallDepth;
}
@end
#import "BugTextField.h"
@implementation BugTextField
- (BOOL) resignFirstResponder
{
if (0 == resignFirstResponderCallDepth++)
{
// ---------------------------------------------------------------------
// Code executed by first stack frame to call resignFirstResponder.
NSLog(@"resignFirstResponder");
}
// -------------------------------------------------------------------------
// Code executed by every stack frame to call resignFirstResponder.
BOOL rV = [super resignFirstResponder];
resignFirstResponderCallDepth--;
return rV;
}
@end
一種解決方案是改寫canResignFirstResponder
。 這只會被調用一次。
問題是,這不同於文檔 - https://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIResponder_Class/Reference/Reference.html - 所以你可能是對的:它是一個錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.