有时我发现自己需要将flagstyle iVars
添加到viewControllers
。
例如,如果用户将焦点从一个UITextField
更改为另一个textFieldShouldBeginEditing
,则新字段上的textFieldDidEndEditing
将在旧字段textFieldDidEndEditing
之前调用。
如果我出于某种原因需要知道tagnumberForNextTextField
下一个哪个字段会成为焦点,我会在textFieldShouldBeginEditing
中设置一个标记textFieldDidEndEditing
,可以对其进行检查在iVar
之后。
现在,问题是,这种设计会产生错误的代码,因为通常很难确保标志在不再相关时重置。
理想情况下,我永远不需要使用这些可怕的标志,但如果我确实需要它们,是否有办法确保property
(或@interface MyController()
@property (nonatomic, assign) NSInteger tagForTextFieldThatWillBeginEditing;
@property (weak, nonatomic) IBOutlet UITextField *firstTextField;
@property (weak, nonatomic) IBOutlet UITextField *secondTextField;
@property (weak, nonatomic) IBOutlet UITextField *thirdTextField;
@end
@implementation MyController
- (void)viewDidLoad {
[super viewDidLoad];
self.tagForTextFieldThatWillBeginEditing = -1;
}
// This will be called for the new field, before textFieldDidEndEditing is called for the old field
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
self.tagForTextFieldThatWillBeginEditing = textField.tag;
return YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
if (self.firstTextField == textField && self.tagForTextFieldThatWillBeginEditing == self.thirdTextField.tag) {
// Do something special when jumping straight from first to third field, maybe show an alertview or whatever
}
// Here, I can reset the flag
self.tagForTextFieldThatWillBeginEditing = -1;
}
@end
)重置为当前运行循环的结束?(您可以将其与Web应用程序中的请求范围变量进行比较)。
有可能吗?这是可取的吗?
编辑,这是一些示例代码:
{{1}}
但这可能会造成令人讨厌的错误。如果用户退出视图控制器或执行其他意外操作会阻止 textFieldDidEndEditing 被调用,该怎么办?在这种情况下,标志不会重置。在这种特殊情况下,它可能不会成为问题,因为该标志始终在 textFieldShouldBeginEditing 中设置,但它并不重要。 主要的问题是,如果我使用标志,很容易通过在视窗控制器执行的每个角落都没有正确地重置错误来创建错误。
有一个runloop作用域标志是否有意义?或者难以确定在同一个runloop中将要做什么?