繁体   English   中英

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

[英]UItextField within UISearchbar failing after iOS 7 upgrade

我有一个用于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;

尝试这个,它在IOS6IOS7 +和安全的approch工作

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

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

假设第二个searchBar的子视图是UITextField并不是一个好主意。

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

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

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

您可以使用以下类别为UIViewsearchBar查找UITextField

@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

如何在任何版本中都可以使用的递归方法

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM