我在ViewDidLoad
创建了一个显示新视图的自定义按钮(通过downALevel):
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPlay target:self action:@selector(downALevel:)];
self.navigationItem.rightBarButtonItem = addButton;
视图加载正常,按钮有效。当我返回视图时,按钮似乎被禁用,不起作用。我正在使用Xcode 6;这在以前的版本中不是问题。
有什么想法吗?
(IBAction为)downALevel:(ID)发送方{
[self showWaiting];
[self performSelectorInBackground:(@ selector(callGrouper4))withObject:nil];
}
- (无效)showWaiting {
waitAlert = [[UIAlertView alloc] initWithTitle:@"Please Wait...." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil];
[waitAlert show];
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
indicator.center = CGPointMake(waitAlert.bounds.size.width / 2, waitAlert.bounds.size.height - 50);
[indicator startAnimating];
[waitAlert addSubview:indicator];
}
- (void)callGrouper4 {//降级
@autoreleasepool {
float progressPercent;
NSString *progMsg;
NSString *curProgress;
NSNumberFormatter *formatter2 = [[NSNumberFormatter alloc] init];
[formatter2 setNumberStyle: NSNumberFormatterDecimalStyle];
[formatter2 setMinimumFractionDigits:0];
[formatter2 setMaximumFractionDigits:0];
NSManagedObjectContext *newMoc = [[NSManagedObjectContext alloc] init];
NSPersistentStoreCoordinator *coordinator2 = [[self managedObjectContext] persistentStoreCoordinator];
[newMoc setPersistentStoreCoordinator:coordinator2];
[newMoc setUndoManager:nil];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"TrialBalance" inManagedObjectContext:newMoc]];
......大量数据操作......
//光洁度
[waitAlert dismissWithClickedButtonIndex:0 animated:TRUE];
reportBalances2 = nil;
Level2ActivityViewController *newController = [[Level2ActivityViewController alloc] initWithNibName:@"Level2ActivityViewController" bundle:[NSBundle mainBundle]];
[newController setManagedObjectContext:newMoc];
[newController setHeaderTitle:headerTitle];
[newController setLevelToQuery:@"Obj2"];
[newController setDdSumOrDetail:ddSumOrDetail];
[newController setOrgNameVar:orgNameVar];
[newController setPeriodNum:periodNum];
[newController setReportMode:reportMode];
[newController setSectionSort:@"obj1"];
[[self navigationController] pushViewController:newController animated:YES];
}
更新1 让我们调用第一个视图A和新视图B.我刚刚发现如果B具有相同的代码来创建自定义按钮,则A上的按钮被禁用。如果B中没有代码那么一切都很好。我很困惑?? !!
答案 0 :(得分:1)
这似乎违反了几个线程职责!
首先,您正在调用performSelectorInBackground:
但在callGrouper4
方法中,在推送视图控制器之前,您没有切换回主线程。请记住,UIKit不是线程安全的。这可能是一种奇怪的行为,就像你所看到的那样!
您还在不使用NSManagedObjectContext
API创建initWithConcurrencyType:
。这意味着您的托管对象上下文使用NSConfinementConcurrencyType
并发类型。这意味着您不允许将此上下文传递给另一个线程,但是您将它分配给新的视图控制器,它最有可能在主线程上调用它,而不是在其中创建的线程。
创建NSManagedObjectContext
时,您还要设置协调器,如下所示:[[self managedObjectContext] persistentStoreCoordinator]
。我假设你在这里查询的托管对象上下文是以相同的方式创建的,可能是在另一个线程上。在这种情况下,进行此调用也是不安全的!
虽然问题二和三可能会导致以后出现意外行为,但问题很容易就是您的UI行为奇怪的问题。