2012-06-12 6 views
5

Ich habe TextView in meiner Zelle und manchmal während TableView Scroll einige seltsame Anrufe passieren. System mache mein textView First Responder. Ich habe diese Anrufe tun unerwünschtes Verhalten gefunden:Objective-c überschreibt Delegate mit seinem Nachkommen Typ

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

Ich kann nicht herausfinden, warum werden diese genannt, also habe ich versucht, sich damit zu befassen, indem UITextView und übergeordnete - canBecomeFirstResponder erstreckt.

Hier ist meine .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 

Und .m:

#import "TextView.h" 

@implementation TextView 

@synthesize delegate; 

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

@end 

Diese Lösung funktioniert aber auf der Linie @property (nonatomic, assign) id<TextViewDelegate> delegate; ich Warnung habe, und ich weiß nicht, warum. Es sagt Property type 'id<TextViewDelegate>' is incompatible with type 'id<UITextViewDelegate>' inherited from 'UITextView'.

Also warum System möchte TextView First Responder machen, wenn ich nicht mache? Warum bekomme ich diese Warnung? Gibt es eine bessere Lösung als meine?

Antwort

4

Ich bin mir nicht sicher, aber ich vermute, die Warnung ist, weil der Pre-Compiler über TextViewDelegate weiß, aber es weiß noch nicht, dass dieses Protokoll UITextView Protokoll erbt. Erklären Sie es oben wie folgt:

@class TextView; 

@protocol TextViewDelegate <UITextViewDelegate> 

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

@end 

@interface TextView : UITextView 

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

@end 

Aber ich bin mir nicht sicher, ob ich die Frage verstehe. Sie haben eine Tabelle und in einer/mehreren/jeder Zelle haben Sie eine UITextView, richtig? Soll die Textansicht bearbeitet werden? Weil Sie können einfach [textView setEditable:FALSE];

Hope dies hilft.

Grüße,

George

+1

ich diese editierbare Eigenschaft zu setzen hatte versucht, aber es hat auch 'inputAccessoryView' so, wenn es Ersthelfer wird dieser' inputAccessoryView' zeigt. Ich möchte nur die Kontrolle über die Ersthelfer auf diesem Objekt übernehmen. Wie auch immer, du hast Recht mit deiner Antwort. Diese Sache mit uninformierten Pre-Compiler ist Schande ... – user500

Verwandte Themen