6

セルに textView があり、tableView のスクロール中に奇妙な呼び出しが発生することがあります。システムが textView のファーストレスポンダを作成します。これらの呼び出しが望ましくない動作をすることがわかりました:

#0 -[UITextView canBecomeFirstResponder] ()
#1 -[UIView(Hierarchy) deferredBecomeFirstResponder] ()
#2 -[UIView(Hierarchy) _promoteDescendantToFirstResponderIfNecessary] ()

UITextViewこれらが呼び出される理由がわからないので、 を拡張してオーバーライドすることでこれに対処しようとしました- canBecomeFirstResponder

これが私の.hです:

#import <UIKit/UIKit.h>

@protocol TextViewDelegate;

@interface TextView : UITextView

@property (nonatomic, assign) id<TextViewDelegate> delegate;

@end

@protocol TextViewDelegate <UITextViewDelegate>

- (BOOL)canBecomeFirstResponder:(TextView *)textView;

@end

そしてM:

#import "TextView.h"

@implementation TextView

@synthesize delegate;

- (BOOL)canBecomeFirstResponder
{
    return [self.delegate respondsToSelector:@selector(canBecomeFirstResponder:)] ? [self.delegate canBecomeFirstResponder:self] : NO;
}

@end

この解決策は機能しますが、行@property (nonatomic, assign) id<TextViewDelegate> delegate;で警告が表示され、理由がわかりません。それは言いProperty type 'id<TextViewDelegate>' is incompatible with type 'id<UITextViewDelegate>' inherited from 'UITextView'ます。

では、なぜシステムが textView のファーストレスポンダを作成したいのですか? この警告が表示されるのはなぜですか? 私よりも良い解決策はありますか?

4

1 に答える 1

4

TextViewDelegateよくわかりませんが、この警告は、プリコンパイラが知っているが、このプロトコルがプロトコルを継承していることをまだ知らないためだと思われUITextViewます。上で次のように宣言するだけです。

@class TextView;

@protocol TextViewDelegate <UITextViewDelegate>

- (BOOL)canBecomeFirstResponder:(TextView *)textView;

@end

@interface TextView : UITextView

@property (nonatomic, assign) id<TextViewDelegate> delegate;

@end

しかし、質問を理解しているかどうかはわかりません。テーブルがあり、1 つ/複数/各セルに がありUITextViewますね。テキスト ビューを編集可能にしますか? 簡単に設定できるので[textView setEditable:FALSE];

お役に立てれば。

よろしく、

ジョージ

于 2012-06-16T12:35:55.147 に答える