1

有时我发现自己需要将 flagstyle 添加iVarsviewControllers.

例如,如果用户将焦点从一个更改UITextField为另一个,textFieldShouldBeginEditing则在新字段上将textFieldDidEndEditing在旧字段上被调用。

如果我出于某种原因需要知道textFieldDidEndEditing 接下来将在哪个字段中成为焦点,我会设置一个标志 , tagnumberForNextTextFieldin 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中,但这并不重要。主要问题是,如果我使用标志,很容易在视图控制器执行的每个角落都没有正确重置它们,从而很容易产生错误。

有一个运行循环范围的标志有意义吗?还是无法确定在同一个运行循环中究竟会做什么?

4

0 回答 0