【问题标题】:iPhone Busy ViewiPhone 忙碌视图
【发布时间】:2011-05-04 12:01:24
【问题描述】:

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

我正在努力实现的目标

  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 的结果 - 没有看到“忙碌视图”出现

【问题讨论】:

    标签: iphone uiview uisearchbar busyindicator


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢 Kovpas,正是我想要的。我创建了一个静态类,它有一个线程函数调用,可以像你说的那样加载视图。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 2012-02-01
      • 2017-05-25
      • 1970-01-01
      • 2018-11-04
      • 2017-04-08
      • 1970-01-01
      相关资源
      最近更新 更多