UISearchbar中的UItextField在iOS 7升级后失败

我有一个UITextField的UISearchBar这是工作,直到iOS 7升级,现在失败在这一行: UITextField *textfield=(UITextField*)[[searchBar subviews] objectAtIndex:1];

任何想法如何解决这个问题? 谢谢

  // 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; 

试试这个,它在IOS6IOS7 +都能正常工作,并且安全可靠

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

假设第二个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在您的searchBarfindUITextField

 @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 

试试这个iOS7。

TESTED

 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; } } 

如何可以欺骗任何版本的工作的recursion方法

 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; }