有时我发现自己需要将 flagstyle 添加iVars
到viewControllers
.
例如,如果用户将焦点从一个更改UITextField
为另一个,textFieldShouldBeginEditing
则在新字段上将textFieldDidEndEditing
在旧字段上被调用。
如果我出于某种原因需要知道textFieldDidEndEditing
接下来将在哪个字段中成为焦点,我会设置一个标志 , tagnumberForNextTextField
in textFieldShouldBeginEditing
,可以在 之后立即检查textFieldDidEndEditing
。
现在,问题是,这种设计会产生错误代码,因为通常很难确保标志在不再相关时被重置。
理想情况下,我永远不需要使用这些可怕的标志,但如果我确实需要它们,有没有办法确保在当前运行循环结束时重置iVar
(或)?property
(您可以将其与 Web 应用程序中的请求范围变量进行比较)。
可能吗?可取吗?
编辑,这里是一些示例代码:
@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
但这会产生令人讨厌的错误。如果用户退出视图控制器或发生其他意外情况,会阻止调用textFieldDidEndEditing怎么办?在这种情况下,标志不会被重置。在这种特殊情况下,它可能不会成为问题,因为该标志始终设置在textFieldShouldBeginEditing中,但这并不重要。主要问题是,如果我使用标志,很容易在视图控制器执行的每个角落都没有正确重置它们,从而很容易产生错误。
有一个运行循环范围的标志有意义吗?还是无法确定在同一个运行循环中究竟会做什么?