に 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に設定されているため、問題にはならないかもしれませんが、実際には問題ではありません。主な問題は、フラグを使用すると、viewcontroller 実行のあらゆるコーナー ケースでフラグを正しくリセットしないことで、バグが発生しやすくなることです。
runloop スコープのフラグを持つことは理にかなっていますか? それとも、同じ実行ループで何が行われるかを正確に確認するにはあまりにも予測不可能ですか?