0

目的:我想在搜索栏的文本字段中将右视图设置为标签

以下代码在 ios 6 中可以正常工作以执行相同的操作:

UISearchBar  *search = [[UISearchBar alloc] init];
[search setTintColor:[UIColor grayColor]];
search.frame = CGRectMake(0, 150, 320,50);
search.delegate = self;

UITextField *searchField=[search.subviews objectAtIndex:1];//Changed this line in ios 7
searchField.backgroundColor=[UIColor redColor];

UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
label.text=@"Hello";
label.textColor=[UIColor greenColor];

searchField.rightView = label;
searchField.rightViewMode = UITextFieldViewModeAlways;

[self addSubView:search];

当我在 ios 7 中运行相同的代码(xcode 7.0.2 完全更新)时,它给了我错误,在谷歌搜索后我得到了搜索栏到文本字段的层次结构已经改变,所以我修改了我的代码:

将上面代码中的注释行替换为:

UITextField *searchField=[((UIView *)[search.subviews objectAtIndex:0]).subviews lastObject];

这样做之后,它没有给我任何错误(还通过打印文本字段的描述检查日志并且一切正常),当我运行它时,它给出了带有红色背景的文本字段,但没有向我显示 rightView 的标签。现在,任何人都可以帮助我如何显示这个右视图。

4

3 回答 3

8

如果您想以编程方式执行此操作,则必须UISearchBar在 .h 文件中声明对象。

UISearchBar  *searchBar;

在您的 .m 文件中,您可以编写如下代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.
    searchBar = [[UISearchBar alloc] init];
    [searchBar setTintColor:[UIColor grayColor]];
    searchBar.frame = CGRectMake(0, 150, 320,50);
    searchBar.delegate = self;

    [self.view addSubview:searchBar];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    UITextField *searchField;
    if ([[[UIDevice currentDevice] systemVersion] floatValue]<7.0)
        searchField=[searchBar.subviews objectAtIndex:1];
    else
        searchField=[((UIView *)[searchBar.subviews objectAtIndex:0]).subviews lastObject];

    searchField.backgroundColor=[UIColor redColor];

    UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
    label.text=@"Hello";
    label.textColor=[UIColor greenColor];

    searchField.rightView = label;
    searchField.rightViewMode = UITextFieldViewModeAlways;
}

我认为这适用于 iOS7 和 iOS7 的早期版本。

于 2013-10-22T09:07:57.317 回答
4

首先,您的方法不好,并且无法跨 iOS 版本维护。我认为 UISearchBarTextField 的右视图的初始化是在您将自定义视图设置为它的 rightView 属性之后进行的。如果您在 viewDidAppear 方法中设置 searchField.rightView,您将看到正确的结果:

- (void)viewDidAppear:(BOOL)animated {
     [super viewDidAppear:animated];
     UITextField *searchField=[((UIView *)[_searchBar.subviews objectAtIndex:0]).subviews lastObject];

     UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
     label.text=@"Hello";
     label.textColor=[UIColor greenColor];

     searchField.rightView = label;
     searchField.rightViewMode = UITextFieldViewModeAlways;
}

我已经在 iOS 7 模拟器上对其进行了测试,并且可以正常工作。

于 2013-10-21T19:41:50.543 回答
0

您必须先获取文本字段。
无需索引子视图来获取文本字段或栏按钮。

可以直接获取文本字段和栏按钮

迅速

let textField = searchBar.valueForKey("searchField") as? UITextField
let cancelBarButton = searchBar.valueForKey("cancelBarButtonItem") as? UIBarButtonItem

在 Objective-C 中

UITextField *textField = [searchBar valueForKey:@"searchField"]:
UIBarButtonItem *cancelBarButton = [searchBar valueForKey:@"cancelBarButtonItem"]:

然后你可以设置左视图和右视图

textField.leftView = yourView
textField.rightView = yourView
于 2015-08-18T06:53:43.740 回答