2012-06-12 10 views
5

Ho textView nella mia cella e talvolta durante lo scroll di TableView si verificano alcune chiamate strane. Sistema rendere il mio visualizzatore prima risponditore. Ho trovato queste chiamate fanno comportamento indesiderato:Delegato override di tipo Objective-C con il suo tipo discendente

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

non riesco a trovare il motivo per cui sono chiamati questi, così ho cercato di affrontare questo estendendo UITextView e prioritario - canBecomeFirstResponder.

Ecco il mio .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 

E .m:

#import "TextView.h" 

@implementation TextView 

@synthesize delegate; 

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

@end 

Questa soluzione funziona, ma sulla linea @property (nonatomic, assign) id<TextViewDelegate> delegate; ho avvertimento e non so perché. Dice Property type 'id<TextViewDelegate>' is incompatible with type 'id<UITextViewDelegate>' inherited from 'UITextView'.

Quindi, perché il sistema desidera rendere textView come prima risposta se non lo faccio? Perché sto ricevendo questo avviso? C'è una soluzione migliore della mia?

risposta

4

Non sono sicuro, ma sospetto che l'avviso sia dovuto al fatto che il pre-compilatore conosce TextViewDelegate ma non sa ancora che questo protocollo sta ereditando il protocollo UITextView. Basta dichiararlo sopra in questo modo:

@class TextView; 

@protocol TextViewDelegate <UITextViewDelegate> 

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

@end 

@interface TextView : UITextView 

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

@end 

Ma non sono sicuro di aver capito la domanda. Hai una tabella e in una/più/ogni cella hai uno UITextView, corretto? Vuoi che la visualizzazione del testo sia modificabile? Perché puoi semplicemente impostare [textView setEditable:FALSE];

Spero che questo aiuti.

saluti,

George

+1

mi avevano cercato di impostare questa proprietà modificabile, ma ha anche 'inputAccessoryView' così quando diventa first responder questo' inputAccessoryView' mostra. Voglio solo prendere il controllo di diventare il primo soccorritore su questo oggetto. Ad ogni modo, hai ragione con la tua risposta. Quella cosa con il pre-compilatore non informato è vergogna ... – user500

Problemi correlati