2013-08-19 31 views
1

我創造我自己的子類是基本的UIViewUILabel並在它的UITextField一個子類。我自己的子類的委託方法周圍的UITextField的委託方法包裝被撞毀我的應用程序

所以我還是想的UITextField委託方法起作用,所以我創建了自己的協議稱爲MyLabeledInputViewDelegate基本上包裝以這種方式圍繞UITextField的委託方法:

-(BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    return [self.delegate inputViewShouldReturn:self]; 
} 

我,因爲文本字段是我自己的類的實例的屬性,我當然把它的代表是這樣的:

if (self.delegate) self.textField.delegate = self; 

但不過,似乎如果我的init MyLabeledInputView與代表小號等到nil,由於某種原因立即崩潰。

我是否正確設定了這個值,或者是否有某些我失蹤的東西?非常感謝你!

我指定初始化是這樣的:

- (id)initWithFrame:(CGRect)frame 
     titleRelativeLength:(float)length 
     titleText:(NSString *)text 
     titleBackgroundColor:(UIColor *)color 
     titleTextColor:(UIColor *)textColor 
     textFieldBGColor:(UIColor *)textFieldBGColor 
     textFieldTextColor:(UIColor *)textFieldTextColor 
     delegate:(id<WRLabeledInputViewDelegate>)delegate; 

實現是這樣的:

- (id)initWithFrame:(CGRect)frame titleRelativeLength:(float)length titleText:(NSString *)text titleBackgroundColor:(UIColor *)color titleTextColor:(UIColor *)textColor textFieldBGColor:(UIColor *)textFieldBGColor textFieldTextColor:(UIColor *)textFieldTextColor 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     self.titleRelativeLength = length; 
     self.title = text; 
     self.titleBackgroundColor = color; 
     self.titleTextColor = textColor; 
     self.textFieldBackgroundColor = textFieldBGColor; 
     self.textFieldTextColor = textFieldTextColor; 
    } 
    return self; 
} 

這基本上只捕獲傳入的屬性,然後我設置的UITextField的代表在layoutSubviews到成爲我自己班的實例。

+0

什麼是控制檯輸出? – Justin

+0

它在我指定的初始化器上崩潰,並且說無法識別的選擇器發送給它的內存地址的某個實例 – Enzo

+0

選擇器的名稱和實例的類是什麼。這是你如何縮小崩潰。它告訴你,你發送消息的對象沒有實現它們。 – Justin

回答

1

好吧,我現在看到,你錯過了添加一個參數到你的實現。補充一點,你會很開心。而self.delegate = delegate;

編輯:

你應該對任何包裹代表呼籲這樣做,(或任何時候你創建自己的協議)

if ([self.delegate respondsToSelector:@selector(inputViewShouldReturn:)]) { 
    [self.delegate inputShouldReturn:self]; 
} 

如果不實施該委託方法你的聽力課,你會得到一個崩潰,除非你問對象,如果它首先響應。

+0

謝謝!接受認真的幫助:) – Enzo

+0

是的,沒有理由爲什麼你的程序應該立即崩潰,因爲你試圖包裝委託消息。只要你說控制檯錯誤,我知道它是別的 – Justin

+0

另外,將你的init方法中的textField委託設置爲self。捕捉你想要在課堂上聽的方法。轉發他們與您的協議裏面。看看我的新編輯瞭解更多信息: – Justin

2

看起來你在設置導致它崩潰的代理時嘗試了一些奇怪的事情,因爲你試圖調用錯誤對象上的方法。大多數情況下,當你調用一個nil對象的方法時,它只返回nil,但在這種情況下(我相信這是指針指向某個東西的時候,但實際上指向了錯誤類型的對象),它會給你你收到的錯誤。

我會建議,而不是做這種方式,您可以覆蓋你的setter和您委託的吸氣劑子類來設置文本框的委託來代替,如:

- (void)setDelegate:(id<UITextFieldDelegate>)delegate { 
    self.textField.delegate = delegate; 
} 

- (id<UITextFieldDelegate>)delegate { 
    return self.textField.delegate; 
} 

這樣一來,你不不得不擔心處理你的子類中的代表,或者除了這兩種方法之外,還要處理它們;他們都將自動由textField和委託人處理。

+0

這實際上是一個更好的主意!謝謝! – Enzo

+0

在他的情況下,如果@Enzo這樣做,它不會像他期望的那樣工作。由於他包裝委託方法,他希望'SOME_OTHER_CLASS'遵守他的自定義協議。以你的方式設置委託將他的textField設置爲「SOME_OTHER_CLASS」,他實際上希望他的自定義視圖類成爲textField委託。你明白我的意思 – Justin