1

例如,a UITextField cannot be its own delegate,但它可以将自己注册为自己通知的观察者吗?看起来很奇怪,但似乎工作正常。思考?对象是否可以订阅自己的通知?

// MyTextField.h 

@interface MyTextField : UITextField 
@end 

// MyTextField.m 

@interface MyTextField() 
- (void)myTextFieldDidChange:(NSNotification *)notification; 
@end 

@implementation MyTextField 

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [[NSNotificationCenter defaultCenter] 
     addObserver:self 
     selector:@selector(myTextFieldDidChange:) 
     name:UITextFieldTextDidChangeNotification 
     object:self]; 
    } 
} 

- (void)myTextFieldDidChange:(NSNotification *)notification { 
    // Do custom stuff here. 
} 

@end 
+1

您正在将视图转变为控制器,但是如果它起作用,它就会起作用。为了更好的MVC,让包含文本字段的ViewController成为委托。 –

+0

但是,上面的方法保持了视图控制器的清洁,并允许'MyTextField'在其他视图控制器中被重用,而不必以完全相同的方式重新实现'textFieldDidChange:'功能。 – ma11hew28

回答

1

你在做什么,似乎不错,但有一个为这个特殊的例子更纯净的解决方案:

// MyTextField.h 

@interface MyTextField : UITextField 
@end 

// MyTextField.m 

@interface MyTextField() 
- (void)myTextFieldDidChange:(UITextField *)textField; 
@end 

@implementation MyTextField 

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self addTarget:self action:@selector(myTextFieldDidChange:) 
     forControlEvents:UIControlEventEditingChanged]; 
    } 
    return self; 
} 

- (void)myTextFieldDidChange:(MyTextField *)myTextField { 
    // Do custom stuff here. 
} 

@end 

退房的UIControlEvents reference

相关问题