1

我试图在搜索过程中显示繁忙的视图,但它似乎从未显示。

我想要达到的目标

  1. 用户在 UISearchBar 中输入文本后单击搜索按钮。
  2. 输入的文本被委托给 searchBarSearchButtonClicked。
  3. 显示一个“忙碌视图”,它是一个 UIView,其中包含一个 UIActivityIndi​​catorView 以指示搜索正在进行中。
  4. 执行与网站通信的搜索。
  5. 搜索完成后,删除“忙碌视图”。

怎么了

搜索过程运行良好,使用调试器我可以看到它在 searchBarSearchButtonClicked 函数中正常移动,但是“忙碌视图”从未出现。搜索需要 2-3 秒,所以理论上我应该会在 2-3 秒内看到我的“忙碌视图”。


代码尝试 1 -在超级视图中添加和删除“忙碌视图”**

- (void)searchBarSearchButtonClicked:(UISearchBar *)activeSearchBar {

 [activeSearchBar setShowsCancelButton:NO animated:YES];
 [activeSearchBar resignFirstResponder];
 [busyView activateSpinner]; //start the spinner spinning
 [self.view addSubview:busyView]; //show the BusyView

 Search *search = [[Search alloc]init];
 results = [search doSearch:activeSearchBar.text];

 [busyView deactivateSpinner]; //Stop the spinner spinning
 [busyView removeFromSuperview]; //remove the BusyView
 [search release]; search = nil;

}

尝试 1 的结果 -它没有出现,但是如果我注释掉 removeFromSuperview 调用,忙碌视图仍然在屏幕上。


代码尝试 2 -使用动画

- (void)searchBarSearchButtonClicked:(UISearchBar *)activeSearchBar {



[activeSearchBar setShowsCancelButton:NO animated:YES]; 
 [activeSearchBar resignFirstResponder];

 [UIView beginAnimations:nil context:nil];
 [UIView setAnimationDuration:0];
 [UIView setAnimationDelegate:self];
 [UIView setAnimationDidStopSelector:@selector(animationDidStop)];

 [busyView activateSpinner]; //start spinning the spinner
 [self.view addSubview:busyView]; //show the busy view

 [UIView commitAnimations];

 Search *search = [[Search alloc]init];
 results = [search doSearch:activeSearchBar.text];


 [UIView beginAnimations:nil context:nil];
 [UIView setAnimationDuration:0];
 [UIView setAnimationDelegate:self];
 [UIView setAnimationDidStopSelector:@selector(animationDidStop)];

 [busyView deactivateSpinner]; //sets stops the spinner spinning
 [busyView removeFromSuperview]; //remove the view

 [UIView commitAnimations];
 [search release]; search = nil;
}

尝试 2 的结果 -没有看到“忙碌视图”出现

4

2 回答 2

1

好吧,这是我的解决方案:

  • 创建单例类 MyLoadingView。此类应包含显示和隐藏静态方法。
  • 在 MyLoadingView 构造函数中,您应该手动创建一个带有半透明黑色背景和内部活动视图的视图。将此视图放入[[UIApplication sharedApplication] keyWindow]. 把它藏起来。
  • [MyLoadingView show]调用只是将 myLoadingView 对象置于其容器的最前面:[[[UIApplication sharedApplication] keyWindow] bringSubviewToFront:myLoadingViewSharedInstance];。也不要忘记启动 activityview 动画。
  • [MyLoadingView hide]停止 activityview 动画并隐藏 sharedInstanceView。

请注意,您需要[MyLoadingView show]在单独的线程中调用。

于 2010-11-03T14:11:05.443 回答
0

Cocoa 中的 UI 更改仅在您的代码将控制权返回给运行循环时才会生效。只要你的搜索任务在主线程上同步运行,它就会阻塞执行,包括 UI 更新。

您应该在后台异步执行耗时的任务。对此有多种选择(NSOperation, performSelectorInBackground:..., Grand Central Dispatch, ...)。

于 2010-11-03T14:10:38.950 回答