我有一个TabBar应用程序,带有一个" Home"选项卡和"搜索"标签。 在“主页”选项卡中,我有一个搜索栏,当用户单击“搜索”时,我希望将文本字符串复制到“搜索”选项卡的视图控制器中,并使用该字符串执行搜索。
为了传递字符串,我试图发送通知,然后强制TabBarController切换标签。这两个步骤都有效;问题是,我只会在加载后添加观察者(在搜索视图控制器中),这只会在我第一次加载视图后才会发生。 换句话说,在正确设置观察者之前发送通知,因此忽略它。
这个问题的最佳解决方案是什么?
编辑:
在Home View Controller上:
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
[[self tabBarController] setSelectedIndex:2]; // Switch to Search VC
[[NSNotificationCenter defaultCenter] postNotificationName:@"SearchFromHome" object:self userInfo:@{@"Query" : [searchBar text]}];
}
在搜索视图控制器上:
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(searchFromHome:) name:@"SearchFromHome" object:nil];
}
搜索视图控制器不会观察通知,除非我先加载它;方法searchFromHome:
未被调用。
如果我尝试在应用加载后立即执行搜索(它在Home VC加载),则会忽略通知,因为搜索VC尚未设置为观察它。
答案 0 :(得分:1)
您无法将通知发送到搜索视图控制器,因为您已经正确地推测它尚未创建。我知道如何解决这个问题有两种基本方法:
A)(坏方法)当主标签栏控制器加载时加载搜索视图控制器 - 不必要地增加内存负载(如果用户从未搜索过该怎么办?)
B)(好方法)在搜索视图控制器和主页选项卡控制器上创建公共NSString属性。然后,将标签栏控制器设置为“SearchFromHome”通知的观察者(听起来你可能已经在做了,因为你说你能够以编程方式切换标签)。标签栏控制器应该有一个方法,在发布通知时激活该方法。在该方法中检查是否已创建搜索视图控制器,如果是,请切换到它并将NSString'searchText'属性设置为在主选项卡控制器中输入的任何搜索字符串。如果尚未创建,则创建它并设置搜索字符串。
粗略示例代码:
//In TabBarController.m
//Be sure to set this class instance as an observer of @"SearchFromHome" notifications
//with the target being the method below
-(void)searchTabActivator
{
if (!self.searchBarController) {
self.searchBarController = //Instantiate view controller code
}
self.searchBarController.searchText = self.homeTabController.searchText;
//Switch to search tab and perform search
}
答案 1 :(得分:0)
我不确定您要做什么,但您可以为搜索栏创建一个属性:
.h file.
@interface yourcontroller{
IBOutlet UISearchBar *searchBar;//make sure have set the referencing outlet
}
// or create the property like this
@property (strong, nonatomic) IBOutlet UISearchBar *searchBar;
并且在方法搜索中只需执行此操作
-(void)search{
NSString *searchText = searchBar.text;
}
我希望这可以帮到你。
答案 2 :(得分:0)
如果您想收到通知,则必须观察发件人。如果您尚未添加观察者,则不会收到任何通知。 在您的情况下,我建议您将搜索字符串存储在搜索选项卡控制器的属性中。当此控制器出现时,您可以开始使用此字符串进行搜索。