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] 

现在,您还可以在字典中传递其他任何信息。