-1

我有以下 UIAlertView 加载指示器的代码,它不起作用并给了我

- (void) launchActivity
{
 //some logic...
[NSThread detachNewThreadSelector:@selector(updateFilterProgress) toTarget:self withObject:nil];
}
- (void) updateFilterProgress {
 if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
{
    UIAlertView *myAlert = [[[UIAlertView alloc] initWithTitle:@"No Internet Connectivity" message:@"This app require an internet connection via WiFi or cellular network to work." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil] autorelease];
    [myAlert show];
}
else{
    UIAlertView *alertMe = [[[UIAlertView alloc] initWithTitle:@"Loading..." message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles: nil] autorelease] ;


  //tried this way by placing below line....no result   
  [alertMe performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];
    //[alertMe show];

 //some logic...
}

更新: 在主线程上,我正在调用 Web 服务并加载数据。因此我给出了另一个加载 UIAlertView 的线程,它正在使用 iOS 4,5。但它在 iOS 6 中崩溃。如果我将 AlerView 放在主线程上,那么在加载时什么都没有显示,但在加载数据后 AlertView 显示加载指示器几秒钟。任何建议...

4

3 回答 3

1

您正在显示来自分离线程的警报,而您必须从主线程执行此操作,使用 GCD 或performSelectorOnMainThread.


在主线程上您通常只想执行 UI 更新,所有复杂的计算和数据加载都将在分离的线程中执行。如果您尝试在主线程中加载数据,则 UI 在加载期间将无响应。因此,在分离线程中加载数据是一个很好的做法,在主线程上,您根据需要在加载开始时显示警报并在加载(和解析)完成时将其关闭,同时调用内容 UI 更新:

加载/刷新数据源流

于 2012-11-05T12:14:35.047 回答
1

这是一种不好的做法。

Apple 文档说您需要在主线程上处理 UI 元素。

我认为问题在于这一行:

[NSThread detachNewThreadSelector:@selector(updateFilterProgress) toTarget:self withObject:nil];

您不会在其他线程上而不是在主线程上处理 UI 元素。

采用:

[self updateFilterProgress];

或者像这样使用:

[yourAlert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];

我也检查了你的代码。弹出一个错误:

错误是:“UIAlertView”没有可见的@interface 声明选择器“performSelectorOnCurrentThread:withObject:waitUntilDone:”

performSelectorOnMainThread对我来说非常有用。

于 2012-11-05T12:14:54.170 回答
0

试试这个

- (void) launchActivity
{
 //some logic...
[NSThread detachNewThreadSelector:@selector(updateFilterProgress) toTarget:self withObject:nil];
}
- (void) updateFilterProgress {
 if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
{
    [self performSelectorOnMainThread: @selector(showAlertForNoNetConnect)];
}
else{
    [self performSelectorOnMainThread: @selector(showAlertForLoading)];
 //some logic...
}

- (void) showAlertForNoNetConnect
{
    UIAlertView *myAlert = [[[UIAlertView alloc] initWithTitle:@"No Internet Connectivity" message:@"This app require an internet connection via WiFi or cellular network to work." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil] autorelease];
    [myAlert show];

}
- (void) showAlertForLoading
{
    UIAlertView *alertMe = [[[UIAlertView alloc] initWithTitle:@"Loading..." message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles: nil] autorelease] ;
    [alertMe show];

}

您必须在主线程中调用所有 UIKit 元素。这就是问题所在。希望这可以帮助。快乐编码。:)

于 2012-11-05T12:33:31.610 回答