1

我有一个 TabBar 应用程序,带有一个“主页”选项卡和一个“搜索”选项卡。在主页选项卡中,我有一个搜索栏,当用户单击搜索时,我想将文本字符串复制到搜索选项卡的视图控制器中并使用该字符串执行搜索。

为了传递字符串,我尝试发送通知,然后强制 TabBarController 切换选项卡。这两个步骤都有效;问题是,我只会在加载后添加观察者(在搜索视图控制器中),这只会在我第一次加载视图后发生。换句话说,通知是在观察者被正确设置之前发送的,因此它被忽略了。

这个问题的最佳解决方案是什么?

编辑:

在主视图控制器上:

- (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 中加载),通知将被忽略,因为 Search VC 尚未设置为观察它。

4

3 回答 3

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
}
于 2013-10-01T19:43:46.333 回答
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;
}

我希望这可以帮助你。

于 2013-10-01T18:46:58.473 回答
0

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

于 2013-10-01T19:27:36.677 回答