5

UITextView のサブクラスがあり、それを独自のデリゲートにしたいと考えています。メソッドをオーバーライドして、textView:shouldChangeTextInRange:replacementText:連続したスペースが入力されないようにすることができます。

( [SATextView awakeFromNib]SATextView は UITextView の私のサブクラスです) で、私は[self setDelegate:self];. テキストビューを押して編集を開始すると、すべてがフリーズして最終的に停止し、そのバックトレースは無限ループがあったことを示しています。

すべてのデリゲート メソッドを実装するか、1 つだけ実装するか、まったく実装しないかは問題ではありません。それらのメソッドが空であるかどうかも問題ではありません。

これが無限ループを引き起こすのはなぜですか? UITextView を使用する場合にのみ発生するようです (他のオブジェクトをサブクラス化し、デリゲートを自己に設定すると、この問題は発生しません)。どうすればそれを止めることができますか?または、このサブクラスに連続したスペースを持たせないようにするより良い方法はありますか?

4

3 に答える 3

1

アイデア...実際のデリゲートとUITextViewの間の仲介者として機能するデリゲートクラスを作成できます(おそらく、しばらくしてデリゲートを設定する必要があるためです)。したがって、この新しいクラスはデリゲート プロトコルを実装しますが、独自のデリゲートのプロパティも持つため、textView:shouldChangeTextInRange:replacementText: を転送し、middleMan クラスでスペースを編集する作業を行うことができます。

于 2012-06-26T20:44:55.570 に答える
0

オブジェクトに任意の数のオブザーバーをサブスクライブすることが可能です。したがって、それ自体を購読することが可能です:

@implementation MyTextView 

-(id) initWithFrame:(CGRect)frame // or initWithCoder: for loading from nib
{
    self = [super initWithFrame:frame];
    if(self) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewTextDidChangeNotification:) name:UITextViewTextDidChangeNotification object:self];
    }
    return self;
}

-(void)textViewTextDidChangeNotification:(NSNotification*)n
{
    self.text = [self.text stringByReplacingOccurrencesOfString:@"  " withString:@" "];
}
于 2012-06-26T23:25:08.257 に答える