我有以下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显示加载指示器几秒钟。任何建议......
答案 0 :(得分:1)
您必须从主线程中显示分离线程的警报,使用GCD或performSelectorOnMainThread
。
在主线程上,您通常只想执行UI更新,所有复杂的计算和数据加载都将在分离的线程中执行。如果您尝试在主线程中加载数据,则在加载期间UI将不会响应。因此,在分离的线程中加载数据是一个很好的做法,在主线程上,您在加载开始时显示警报,并在加载(和解析)完成时关闭它,同时调用内容UI更新:
答案 1 :(得分: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
对我来说非常合适。
答案 2 :(得分: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元素。这就是问题所在。 希望这可以帮助。快乐的编码。 :)