gpt4 book ai didi

ios - 为什么 resignFirstResponder 在 iOS 5.0 中被调用两次,而在 iOS4.2-4.3 中只被调用一次?

转载 作者:可可西里 更新时间:2023-11-01 03:34:44 25 4
gpt4 key购买 nike

我在 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

在设备和模拟器上运行代码给出了恒定的结果。我是否遗漏了什么或者这是一个错误?

iOS 5.0 堆栈跟踪

#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

错误文本字段.h

#import <UIKit/UIKit.h>

@interface BugTextField : UITextField

@end

错误文本字段.m

#import "BugTextField.h"

@implementation BugTextField

- (BOOL) resignFirstResponder
{
NSLog(@"resignFirstResponder");

return [super resignFirstResponder];
}

@end

BugTextFieldVC.h

#import <UIKit/UIKit.h>
@class BugTextField;

@interface BugTextFieldVC : UIViewController <UITextFieldDelegate> {
BugTextField *bugTextField;
}

@end

BugTextFieldVC.m

#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。

错误文本字段.h

#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

错误文本字段.m

#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

关于ios - 为什么 resignFirstResponder 在 iOS 5.0 中被调用两次,而在 iOS4.2-4.3 中只被调用一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7749095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com