来自iOS 7.1中UISearchBar的UITextField

Bhu*_*hta 0 objective-c uitextfield uisearchbar ios

我正在访问搜索栏的文本字段.这不断变化

对于我正在使用的iOS 6

    textField = [searchbar.subviews objectAtIndex:1];
Run Code Online (Sandbox Code Playgroud)

它在iOS 7中有一个视图,并且有一个子视图,我们可以从中获取textField,所以我使用以下代码用于iOS 7或更高版本的iOS

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

现在自iOS 7.1以来,searchbarview只有一个子视图是UISearchBarBackground,与iOS 7.0不同,它有两个子视图,所以即使我使用for循环遍历所有子视图,我也无法获得textField

任何人都可以帮我这个谢谢,

编辑 这是searchbarview.subviews返回的数组的日志,你可以看到它只返回一个UISearchBarBackground对象,所以我想知道UITextField对象在哪里

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

Ton*_*ony 8

我在iOS 7.1的模拟器上测试过.我看到UISearchBar的结构如下:

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

的UISearchBar

++ UIView

++++ UISearchBarBackground

++++ UISearchBarTextField(这是UITextField对象)

++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++

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

从Spark Inspector获取

所以在iOS 7.1上,您可以像这样获得UITextField:

UIView *subviews = [searchbar.subviews lastObject];
UITextField *textView = (id)[subviews.subviews objectAtIndex:1];
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

如果您UISearchBar在a中UIViewController,请尝试使用方法viewDidLoad或代码viewWillAppear!

UITextField一旦你创建就不要寻找UISearchBar(寻找UISearchBar已经出现在屏幕上)


Mih*_*hta 5

我创建了一个可以在任何版本的 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;
}
Run Code Online (Sandbox Code Playgroud)

你可以调用这个方法

UITextField *searchBarTextField = [self findTextFieldFromControl:self.placeSearchBar];
Run Code Online (Sandbox Code Playgroud)