16

假设我将 a 添加UITextView到 myUIView中,并且我希望它在每次内容更改时更改其背景颜色。我可以通过成为UITextView和实施的代表来做到这一点textViewDidChange

如果我经常使用这种行为,那么创建一个UITextView子类是有意义的,我将其称为ColorSwitchingTextView. 默认情况下,它应该包括颜色切换行为,因此如果需要该行为,任何人UIView都可以简单地添加它而不是标准UITextView

如何检测ColorSwitchingTextView班级内内容的变化?我不认为我可以做类似的事情self.delegate = self

总而言之,UITextView子类如何知道其内容何时发生变化?

编辑似乎我可以使用self.delegate = self,但这意味着使用的 UIViewControllerColorSwitchingTextView也不能订阅通知。一旦我switchingTextView.delegate = self在视图控制器中使用,子类行为就不再起作用。任何解决方法?我正在尝试获得一个习惯UITextView,否则它就像一个普通的UITextView.

4

4 回答 4

23

在您的子类中,监听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];
}
于 2012-11-12T02:52:34.577 回答
5

最好从一开始就以正确的方式去做。

Apple 和 SOLID 的建议是子类化不是 UITextView,而是 UIView。在您的自定义 UIColorTextView 中,您将有成员 UITextView 作为子视图,而您的 UIColorTextView 将是它的代表。此外,您的 UIColorTextView 将拥有自己的委托,并将所需的委托回调从 UITextView 传递给它的委托。

我有一些这样的任务,不是使用 UITextView,而是使用 UIScrollView。

于 2012-11-12T04:43:23.847 回答
2

在您的子类中,self作为观察者添加到UITextViewTextDidChangeNotification.

也就是说,我不同意正在进行的对话,即设置self为代表是一个坏主意。对于这种特殊情况,当然,但这只是因为有更好的方法(UITextViewTextDidChangeNotification)。

于 2012-11-12T03:37:18.267 回答
1

您可以使用 NSNotificationCenter。

在子类中将委托设置为 self (从未尝试过,但您说它有效),然后在您想要获取通知的视图控制器中,执行

[[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]

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

于 2012-11-12T03:39:36.570 回答