UITextView的子类为本身代表(UITextView subclass as delegate

2019-07-03 18:22发布

比方说,我一个添加UITextViewUIView ,我希望它每次的内容的变化而变化的背景颜色。 我可以成为的委托做到这一点UITextView和实施textViewDidChange

如果我使用的这种行为频繁,虽然,这是有道理创建UITextView子类,我会打电话给ColorSwitchingTextView 。 它应该包括默认颜色切换行为,让任何UIView可以简单地添加它,而不是一个标准UITextView如果希望这样的行为。

如何从我内检测的内容变化ColorSwitchingTextView类? 我不认为我可以这样做self.delegate = self

总之,怎么能UITextView子类,知道什么时候它的内容发生变化?

编辑看来我可以用self.delegate = self ,但这意味着使用了该UIViewController的ColorSwitchingTextView也不能订阅通知。 有一次,我用switchingTextView.delegate = self在视图控制器,子类行为不再起作用。 任何变通办法? 我试图让一个自定义UITextView ,否则就像一个普通UITextView

Answer 1:

在你的子类,监听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];
}


Answer 2:

好做它从一开始就正确的方式。

苹果公司和实体建议,是不子类UITextView的, 但是UIView的 。 在您的自定义UIColorTextView你将有成员的UITextView为子视图和你的UIColorTextView将是它的委托。 此外,您UIColorTextView都会有它自己的代表,并会将从UITextView的要求委托回调到它的委托。

我有过这样不是UITextView的,但有一些的UIScrollView任务。



Answer 3:

在你的子类,添加self作为观察员UITextViewTextDidChangeNotification

这就是说,我不同意正在进行的对话,设置self作为委托是一个坏主意。 对于这种特殊的情况下,肯定的,但仅仅是因为有一个更好的方法(UITextViewTextDidChangeNotification)。



Answer 4:

您可以使用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]

现在,您也可以通过字典中的任何其他信息,以及。



文章来源: UITextView subclass as delegate of itself