iOS:在 UITabBar/UINavigationController 应用程序的视图中设置 nib 子视图中的文本

Posted

技术标签:

【中文标题】iOS:在 UITabBar/UINavigationController 应用程序的视图中设置 nib 子视图中的文本【英文标题】:iOS: Setting text in nib subview from view in UITabBar/UINavigationController application 【发布时间】:2011-05-16 16:16:10 【问题描述】:

在另一个视图加载视图时以编程方式设置 UISearchDisplay 的文本值时遇到问题,我的问题是我的问题是否过于复杂而遗漏了某些内容,或者我的思路是否正确。

情况如下:我有一个 UITabBarController 作为我的根视图,有 2 个选项卡,都有一个 UINavigationController 设置,因此我可以根据需要推送视图。

Tab 1 有一个 UITableViewController,其中填充了类别列表。

Tab 2 的主视图中有一个 MapView,但我已经完成了一个自定义 UINavigationItem 视图来放置各种按钮和一个 UISearchDisplay 在 rightBarButtonitem 区域。

地图视图布局和自定义导航项作为两个单独的视图对象存储在同一个 nib 中。在选项卡 2 的 viewDidLoad() 中,我以编程方式初始化 rightBarButtonItem:

UIBarButtonItem *btnItem = [[UIBarButtonItem alloc] initWithCustomView:buttonBar];
self.navigationItem.rightBarButtonItem = btnItem;
[btnItem release];

一切都启动了,buttonBar 连接到一个 IBOutlet 作为 searchWhat,我可以从 mapview 的控制器类中与这个对象对话。

如果用户在 Tab 1 中并点击一个单元格,我希望它切换到 Tab 2 并填充 searchWhat.text,然后执行搜索代码,就好像有人自己输入了搜索一样。

我遇到的问题是加载和填充视图的顺序。

我可以毫无问题地从第一个标签访问第二个标签,并让它显示如下:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    NSLog(@"Quick Category cell tapped at row %d", indexPath.row);    
    self.tabBarController.selectedIndex = 1; // change to the search view controller
    //[self.tabBarController.selectedViewController viewDidAppear:YES];
    UINavigationController *nav = (UINavigationController *)self.tabBarController.selectedViewController;
    SearchViewController *srch = [nav.viewControllers objectAtIndex:0];
    //NSLog(@"%@", [srch description]);
    [srch queueSearchByType:kSearchTypeQuickCategories withData:[catList objectAtIndex:indexPath.row]];
    [srch viewDidAppear:YES];

不用担心 catList 和 SearchViewController,它们存在并且这个位可以切换标签。

这里的问题是,如果用户启动应用程序并在选项卡 1 中选择一个项目,选项卡 2 会出现,但搜索显示文本的值没有设置 - 因为 viewDidLoad 和 viewDidAppear 在另一个线程中被调用,所以queueSearchByType:withData: 的执行在视图仍在加载和设置时被调用。

如果用户选择选项卡 2(因此初始化子视图)然后选择选项卡 1 和一个项目,它可以填充搜索显示文本。

我不能只更改选项卡的顺序,以便 tab2 是第一个,因此将它的子视图加载到导航栏,因为项目规范首先是类别搜索。

我错过了一些非常简单的事情吗?我需要做的是在调用 queueSearchByType:withData: 之前等待第二个选项卡完全出现 - 有没有办法做到这一点?

目前,我已经实现了一个队列搜索,检查队列搜索方法,这似乎有点啰嗦。

【问题讨论】:

【参考方案1】:

好的,我不喜欢回答我自己的问题,但看来我的担心是对的,基本上,如果您想要一个自定义视图的 UINavigationItem(即,在导航控制器上放置搜索栏和各种其他按钮) ) 并能够从标签栏控制器上的另一个标签切换并填充它们,然后您需要将子视图放在它自己的类中,该类是 UIViewController 的子类,然后委托您的朋友(它已经是),我'已经提供了一个示例,以防任何人需要重复它,我已将其放在我的博客上。

http://www.jamesrbrindle.com/developer/ios-developer/howto-add-a-custom-uinavigationitem-to-a-uinavigationcontroller-with-delegation.htm

如果有人不同意并认为这可以更简单,请告诉我或评价这篇文章

【讨论】:

以上是关于iOS:在 UITabBar/UINavigationController 应用程序的视图中设置 nib 子视图中的文本的主要内容,如果未能解决你的问题,请参考以下文章

iOS8 扩展 - 在 iOS 5/6/7 上会发生啥?

如何在 iOS 4 上运行 iOS 5/ARC 项目

iOS 纵横比约束在 iOS 7 上中断,适用于 iOS 8

iOS 5 MapKit,MKPlacemark,在 iOS 5 上运行 iOS 4.3 应用程序

[iOS] 在 ios10 中使用 imessage

UIButton 在 iOS 7 的兼容模式下没有获得 iOS 6 样式