在我的应用程序中,我使用验证密钥从使用Wi-Fi的服务器下载内容。如果许可证密钥错误或wi-fi不可用,我需要显示UIAlert。我已经写了一个显示警报视图的男女同校,但警报没有显示......这让我的脑子里流下了鲜血......任何人都可以帮忙......控制权正在越过这条线,但仍然是警报未显示。
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *documentsDirectory= [[[UIApplication sharedApplication] delegate] applicationDocumentsDirectory]; //[pathToStore objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingFormat:@"packages"];
NSString *packagePath = [NSString stringWithFormat:@"%@/%@", path,isbnTemp];
[recievedData writeToFile:[documentsDirectory stringByAppendingPathComponent:@"file.zip"] atomically:YES];
NSString *zipPath=[documentsDirectory stringByAppendingPathComponent:@"file.zip"];
[fileManager createDirectoryAtPath:documentsDirectory withIntermediateDirectories:NO attributes:nil error:nil];
ZipArchive *zipArchive = [[ZipArchive alloc]init];
if([zipArchive UnzipOpenFile:zipPath]){
if([zipArchive UnzipFileTo:packagePath overWrite:YES]){
[self loadContent];
}
else{
NSLog(@"Unable to UnArchieve the packages");
}
}
else {
NSLog(@"Failure To Open Archive");
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Your ISBN and/or Licence Key are incorrect" message:Nil delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil];
[alert show];
[alert release];
}
}
答案 0 :(得分:5)
您是否尝试在从主线程以外的线程调用的方法中显示UIAlertView?例如,如果您尝试在异步回调中显示UIAlertView,它可能在单独的线程上运行。
如果是这样,您需要将显示UIAlertView的代码移动到单独的选择器,并使用performSelectorOnMainThread:
方法之一在主线程上调用它。
例如,将以下方法添加到您的类中:
-(void)showAlert {
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Your ISBN and/or Licence Key are incorrect" message:Nil delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil];
[alert show];
[alert release];
}
然后更改当前代码中的最后一个else子句,以便它使用:
[self performSelectorOnMainThread:@selector(showAlert) withObject:nil waitUntilDone:NO];
有关performSelectorOnMainThread:
方法的详情,请参阅NSObject class reference。
答案 1 :(得分:0)
创建警报后,您可以检查警报变量中的NULL指针吗? 也许你需要指定一条消息?除此之外,我发现您发布的代码没有任何问题。