16

UITextViewに を追加しUIView、内容が変わるたびに背景色を変更したいとしましょう。のデリゲートになり、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に設定し(これを試したことはありませんが、機能すると言いました)、通知を取得したいView Controllerで、

[[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 に答える