2014-03-19 58 views
0

我正在訪問搜索欄的文本框。這種不斷變化的UITextField來自iOS 7.1中的UISearchBar

對於iOS 6中,我使用

textField = [searchbar.subviews objectAtIndex:1]; 

它在iOS的7變化有一種觀點,並認爲有子視圖,從中我們可以得到文本框,所以我用下面的代碼搭載iOS 7或更高版本的iOS

UIView *searchbarview = [searchbar.subviews objectAtIndex:0]; 
    NSLog(@"searchbarview.subviews Array is %@",searchbarview.subviews.description); 
    textField = (UITextField *)[searchbarview.subviews objectAtIndex:1]; 

既然現在的iOS 7.1 searchbarview只有一個子視圖是不同的iOS 7.0,其中有兩個子視圖UISearchBarBackground,所以我經歷了所有的子視圖是不是能夠得到文本框,即使我重複使用for循環

誰能幫我這個 謝謝,

編輯 這裏是陣列由searchbarview.subviews返回日誌,你可以看到它返回只有1個對象,它是UISearchBarBackground,所以我想知道是UITextField對象

searchbarview.subviews Array is (
"<UISearchBarBackground: 0xe6bc9d0; frame = (0 0; 768 50); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xe6bcb20>>" 
) 
+0

爲什麼你要訪問的UITextField? – Marc

+0

我想更改文本字段的文本對齊 –

+0

您可以記錄「UISearchBarBackground'對象的子視圖嗎? – VietHung

回答

8

我已經在iOS 7.1的模擬器上測試過。我看到這樣的UISearchBar結構:

====================================== =========

的UISearchBar

++的UIView

++++ UISearchBarBackground

++++ UISearchBarTextField(這是UITextField對象)

++++++++ _UISearchBarSearchFieldBackgroundView

++++++++的UIImageView

====================== =========================

take from Spark Inspector

於是就的iOS 7.1,你可以得到的UITextField像這樣:

UIView *subviews = [searchbar.subviews lastObject]; 
UITextField *textView = (id)[subviews.subviews objectAtIndex:1]; 

===============================================

UPDATE

如果您UISearchBar處於UIViewController,嘗試方法viewDidLoadviewWillAppear你的代碼!

不要,只要你創建UISearchBar(查找後UISearchBar已經出現在屏幕上)

+0

感謝您在這裏的答案subviews.subview產生我陣列1視圖,這是UISearchBarBackground –

+0

你能解釋更多?你什麼時候調用這些代碼行?當searchBar剛剛分配或當searchBar顯示在屏幕上時? – VietHung

+0

你確實是對的,我試着在viewWillAppear並獲得textField。非常感謝您的幫助:) –

0

使用此代碼,以獲得UITextFieldUISearchBar

//First add the following macro: 
    #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 

    //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

    //Then get the text field object: 
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) 
    { 
     for (id object in [[[yourSearchBar subviews] objectAtIndex:0] subviews]) 
     { 
      if ([object isKindOfClass:[UITextField class]]) 
      { 
       NSLog(@"text field found"); 
       UITextField *textField = (UITextField *)object; 
       //do some actions 
       break; 
      } 
     } 
    } 
    else 
    { 
     for (id object in [yourSearchBar subviews]) 
     { 
      if ([object isKindOfClass:[UITextField class]]) 
      { 
       NSLog(@"text field found"); 
       UITextField *textField = (UITextField *)object; 
       //do some actions 
       break; 
      } 
     } 
    } 
+0

感謝您的答案,但這裏的問題是,它不會進入如果條件如果([object isKindOfClass:[UITextField class]])條件,因爲在獲得的數組中沒有這樣的子視圖 –

+0

@Bhumit我剛剛在iOS 7.1上測試它它正在尋找文本字段。如果陳述內容中有日誌嗎? –

+0

是的,已經嘗試過這裏是日誌 searchbar.subviews數組是( 「> 「 ) 正如你所看到的只有1個對象 –

0

如果你想獲得UISearchBarUITextField使用下面的代碼行尋找UITextField

UITextField *textField = [searchBar valueForKey:@"_searchField"]; 

希望對您有所幫助! =)

+4

關鍵是私人的,應用程序可能會被拒絕。 –

1

建議的答案使用私鑰 - 並且會被Apple拒絕 - 或使用NSArray,並且您不能確定這將在未來持續。如果你想改變顏色,屬性等的文字,使用appearanceWhenContainedIn:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextAlignment:NSTextAlignmentCenter]; 
+0

讓我檢查一下,如果它工作的好方法 –

4

我創建了可以在iOS的

任何版本的
- (UITextField *) findTextFieldFromControl:(UIView *) view 
{ 
    for (UIView *subview in view.subviews) 
    { 
     if ([subview isKindOfClass:[UITextField class]]) 
     { 
      return (UITextField *)subview; 
     } 
     else if ([subview.subviews count] > 0) 
     { 
      UIView *view = [self findTextFieldFromControl:subview]; 
      if (view) { 
       return (UITextField *)view; 
      } 
     } 
    } 
    return nil; 
} 

可以調用遞歸方法此方法

UITextField *searchBarTextField = [self findTextFieldFromControl:self.placeSearchBar]; 
+0

Dint for iOS 9 ...可能蘋果再次改變它。修改後的 - (UITextField *)findTextFieldFromControl:(UIView *)view int {0} subViewIndex = 0; for(UIView * subview in view.subviews){ subViewIndex ++; if([subview isKindOfClass:[UITextField class]]){ return(UITextField *)subview; } else if(subViewIndex 0)else if {subviewIndex = 0; return [self findTextFieldFromControl:subview]; } } return nil; } – Dev

2

您必須首先獲取文本字段。
不幸的是,textfield是一個私有屬性。

您可以循環和索引子視圖以獲取文本字段專用屬性,
或者您可以使用專用屬性名直接獲取文本字段。

兩種方式都是一樣的,你訪問私有屬性。

1.循環

for subview in searchBar.subviews { 
    for view in subview.subviews { 
     if let searchField = view as? UITextField { 
      // do something with the search field 
     } 
    } 
} 

2.關鍵

let textField = searchBar.valueForKey("searchField") as? UITextField 
let cancelBarButton = searchBar.valueForKey("cancelBarButtonItem") as? UIBarButtonItem