使NSNotification等到Observer设置完毕

时间:2013-10-01 18:26:50

标签: ios uitabbarcontroller nsnotificationcenter

我有一个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尚未设置为观察它。

3 个答案:

答案 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)

如果您想收到通知,则必须观察发件人。如果您尚未添加观察者,则不会收到任何通知。 在您的情况下,我建议您将搜索字符串存储在搜索选项卡控制器的属性中。当此控制器出现时,您可以开始使用此字符串进行搜索。