2014-03-13 82 views
0
UITextField * textField= self.textField; 
textField.background = [UIImage resizeableImageWithCapInsets2:UIEdgeInsetsMake(0, 7, 0, 7) withName:@"Search-Field"]; 

簡單的代碼。爲什麼此代碼不再適用於7.1?

2014-03-13 09:31:02.099 isikota[179:60b] -[BGSearchBar setBackground:]: unrecognized selector sent to instance 0x17566b20 
2014-03-13 09:32:17.720 isikota[179:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[BGSearchBar setBackground:]: unrecognized selector sent to instance 0x17566b20' 

這沒有意義。顯然,背景是文本框

的財產,我發現這個問題是我用這個:

-(UITextField *) textField 
{ 
    UIView * textFieldView = [self findASubViewWithProtocol:@protocol(UITextInputTraits)]; 

    return (UITextField *)textFieldView; 
} 

這似乎不再得到的UISearchBar一個文本框的方式。那麼怎麼做?

我認爲這個問題是因爲7.1 [UISearchBar conforms to UITextInputTraits]

而且我不知道爲什麼

return (UITextField *)textFieldView; 

不返回運行時錯誤,因爲現在textFieldView不再的UITextField

的一個子類
+1

錯誤說'textField'是一個'BGSearchBar'。 – Pang

+0

我知道。看起來像7.1 UIView * textFieldView = [self findASubViewWithProtocol:@protocol(UITextInputTraits)];返回uisearchbar。 –

回答

2

我我一直這樣做:

for (UIView* v in self.searchbar.subviews) { 
    if ([v isKindOfClass: [UITextField class]]) { 
     return v; 
    } 
} 

或者,在iOS 7中:

for (UIView* v in [self.searchbar.subviews[0] subviews]) { 
    if ([v isKindOfClass: [UITextField class]]) { 
     return v; 
    } 
} 

這是否不起作用?

+0

你必須承認,他們拒絕直接訪問搜索欄內的文本字段是愚蠢的。我們知道它在某處! – matt

+0

我更喜歡你的第二個解決方案。遞歸算法會更具彈性,因爲'subviews [0]'在未來的更新中可能變成'subviews [1] [0]'。 –

+0

@AaronBrager這兩個都不是遞歸的。兩者都是簡單的循環,只能檢查單個子視圖級別。兩者都有可能在某一天破裂。 – rmaddy

相關問題