2012-06-12 13 views
5

Tôi có textView trong ô của mình và đôi khi trong khi xem bảng di chuyển một số cuộc gọi lạ xảy ra. Hệ thống thực hiện trả lời đầu tiên của textView của tôi. Tôi đã tìm thấy những cuộc gọi không mong muốn làm hành vi:Đối tượng ghi đè mục tiêu-c với loại hậu duệ của nó

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

tôi không thể tìm ra lý do tại sao được những kêu gọi, vì vậy tôi đã cố gắng để đối phó với điều này bằng cách mở rộng UITextView và trọng - canBecomeFirstResponder.

Đây là .h của tôi:

#import <UIKit/UIKit.h> 

@protocol TextViewDelegate; 

@interface TextView : UITextView 

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

@end 

@protocol TextViewDelegate <UITextViewDelegate> 

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

@end 

Và .m:

#import "TextView.h" 

@implementation TextView 

@synthesize delegate; 

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

@end 

Giải pháp này hoạt động nhưng trên dòng @property (nonatomic, assign) id<TextViewDelegate> delegate; Tôi đã có cảnh báo và tôi không biết tại sao. Nó nói Property type 'id<TextViewDelegate>' is incompatible with type 'id<UITextViewDelegate>' inherited from 'UITextView'.

Vậy tại sao hệ thống muốn thực hiện trả lời đầu tiên của textView nếu tôi không? Tại sao tôi nhận được cảnh báo này? Có giải pháp tốt hơn tôi?

Trả lời

4

Tôi không chắc chắn, nhưng tôi nghi ngờ cảnh báo là vì trình biên dịch trước biết về TextViewDelegate nhưng chưa biết giao thức này được kế thừa giao thức UITextView. Chỉ cần khai báo ở trên như sau:

@class TextView; 

@protocol TextViewDelegate <UITextViewDelegate> 

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

@end 

@interface TextView : UITextView 

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

@end 

Nhưng tôi không chắc mình hiểu câu hỏi. Bạn có một bảng và trong một/nhiều/mỗi ô bạn có UITextView, đúng không? Bạn có muốn chỉnh sửa chế độ xem văn bản không? Vì bạn chỉ có thể đặt [textView setEditable:FALSE];

Hy vọng điều này sẽ hữu ích.

Kính trọng,

George

+1

Tôi đã cố gắng để thiết lập thuộc tính có thể chỉnh sửa điều này, nhưng nó cũng có 'inputAccessoryView' nên khi nó trở nên trả lời đầu tiên này 'inputAccessoryView' lãm. Tôi chỉ muốn kiểm soát việc trở thành người trả lời đầu tiên về vật thể này. Dù sao, bạn là chính xác với câu trả lời của bạn. Điều đó với trình biên dịch trước không được cải thiện là đáng xấu hổ ... – user500