1

我有一个 UISearchBar 的 UITextField ,它在 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;
4

4 回答 4

2

试试这个,它适用于IOS6IOS7+并且安全方法

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont fontWithName:@"ArialMT" size:10]];
于 2013-10-07T14:17:36.900 回答
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;
        }
    }
于 2013-10-07T14:11:37.857 回答
1

假设 secondsearchBar的子视图将是 UITextField 并不是一个好主意。

我打印了子视图UISearchBar,这就是我在 iOS 7 上得到的:

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

只有一个子视图,所以你... objectAtIndex:1]肯定会崩溃。

您可以使用以下类别在您的UIView中查找:UITextFieldsearchBar

@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
于 2013-10-07T14:17:08.087 回答
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;
}
于 2015-03-17T07:17:34.950 回答