UITextView子类作为它自己的委托
比方说,我添加一个UITextView
到我的UIView
,我希望它改变它的背景颜色,每当内容改变。 我可以通过成为UITextView
的代表和实现textViewDidChange
来做到这一点。
如果我经常使用这种行为,创build一个UITextView
子类是有意义的,我将调用ColorSwitchingTextView
。 它应该包含默认的颜色切换行为,以便任何UIView
可以简单地添加它,而不是标准的UITextView
如果它想要的行为。
如何从ColorSwitchingTextView
类中检测内容中的更改? 我不认为我可以做self.delegate = self
。
总之,一个UITextView
子类如何知道它的内容何时改变?
编辑看来我可以使用self.delegate = self
,但这意味着使用ColorSwitchingTextView
的UIViewController不能也订阅通知。 一旦我在视图控制器中使用了switchingTextView.delegate = self
,子类行为不再起作用。 任何解决方法? 我试图得到一个自定义的UITextView
,否则就像一个普通的UITextView
。
在您的子类中,侦听UITextViewTextDidChangeNotification
通知,并在收到通知时更新背景颜色,如下所示:
/* * When you initialize your class (in `initWithFrame:` and `initWithCoder:`), * listen for the notification: */ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myTextDidChange) name:UITextViewTextDidChangeNotification object:self]; ... // Implement the method which is called when our text changes: - (void)myTextDidChange { // Change the background color } - (void)dealloc { // Stop listening when deallocating your class: [[NSNotificationCenter defaultCenter] removeObserver:self]; }
最好从正确的方式开始。
苹果和SOLID会build议,不是UITextView, 而是UIView子类。 在你的自定义UIColorTextView你将有成员UITextView作为子视图和你的UIColorTextView将它的代表。 此外,你的UIColorTextView将有它自己的委托,并将所需的委托callback从UITextView传递给它的委托。
我有这样的任务,而不是与UITextView,但与UIScrollView。
在你的子类中,将self
添加为UITextViewTextDidChangeNotification
的观察者。
也就是说,我不同意正在进行的把self
当成代表的想法是一个坏主意。 对于这个特定的情况,当然,但只是因为有一个更好的方法(UITextViewTextDidChangeNotification)。
你可以使用NSNotificationCenter。
在子类中将代理设置为自我(从来没有尝试过,但你说它的工作原理),然后在视图控制器中,你想获得通知,做
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidBeginEditing:) name:@"TextFieldDidNotification" object:nil];
在子类中:
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:self forKey:@"textField"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"TextFieldDidBeginEditingNotification" object:self userInfo:userInfo]
现在,您还可以在字典中传递其他任何信息。