2013-10-07 23 views
1

失敗後,我有一個的UITextField對其中的UISearchBar這是工作,直到iOS的7的升級,現在它在該行失敗:UITextField *textfield=(UITextField*)[[searchBar subviews] objectAtIndex:1]; 的UITextField內的UISearchBar的iOS 7的升級

任何想法如何解決這一問題?謝謝

// search bar 
searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 190.0, 44.0)]; 
searchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
UIView *searchBarView = [[UIView alloc] initWithFrame:CGRectMake(90.0, 0.0, 230.0, 44.0)]; 
searchBarView.autoresizingMask = 0; 
searchBar.delegate = self; 

searchBar.layer.borderColor=[UIColor whiteColor].CGColor; 

UITextField *textfield=(UITextField*)[[searchBar subviews] objectAtIndex:1]; 

[searchBarView addSubview:searchBar]; 

self.navigationItem.titleView = searchBarView; 

回答

1

試試這個適用於iOS7的。

檢測過

for (id object in [searchBar subviews]) 
    { 
     for (id subObject in [object subviews]) 
     { 
      if ([subObject isKindOfClass:[UITextField class]]) 
      { 
       UITextField *textfield=(UITextField*)subObject; 
      } 
     } 
    } 

iOS6的

for (id object in [searchBar subviews]) { 
     if ([object isKindOfClass:[UITextField class]]) { 
      UITextField *textfield=(UITextField*)object; 
     } 
    } 
1

這不是假設第二searchBar的子視圖會的UITextField一個好主意。

我打印出來的子視圖爲UISearchBar,這是我在iOS上7了:

<__NSArrayM 0x17d141f0>(
<UIView: 0x17d34f40; frame = (0 0; 320 44); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x17d34fa0>> 
) 

只有一個子視圖,所以你肯定... objectAtIndex:1]會崩潰。

您可以使用以下類別UIView找到你searchBarUITextField

@interface UIView(Utils) 

-(UIView*)findSubviewRecursivelyOfClass:(Class)subviewClass; 

@end 

@implementation UIView(Utils) 

-(UIView*)findSubviewRecursivelyOfClass:(Class)subviewClass 
{ 
    if([self isKindOfClass:subviewClass]) { 
    return self; 
    } else { 
    for(UIView* child in self.subviews) { 
     UIView* result = [child findSubviewRecursivelyOfClass:subviewClass]; 
     if(result) { 
     return result; 
     } 
    } 
    return nil; 
    } 
} 

@end 
2

試試這個,它工作在兩個iOS6的IOS7 +和安全的計算策略

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont fontWithName:@"ArialMT" size:10]]; 
0

如何能夠欺騙任何版本的遞歸方法

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


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