导航栏上的自定义按钮停止工作

时间:2015-01-13 11:06:01

标签: ios objective-c

我在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中没有代码那么一切都很好。我很困惑?? !!

1 个答案:

答案 0 :(得分:1)

这似乎违反了几个线程职责!

首先,您正在调用performSelectorInBackground:但在callGrouper4方法中,在推送视图控制器之前,您没有切换回主线程。请记住,UIKit不是线程安全的。这可能是一种奇怪的行为,就像你所看到的那样!

您还在不使用NSManagedObjectContext API创建initWithConcurrencyType:。这意味着您的托管对象上下文使用NSConfinementConcurrencyType并发类型。这意味着您不允许将此上下文传递给另一个线程,但是您将它分配给新的视图控制器,它最有可能在主线程上调用它,而不是在其中创建的线程。

创建NSManagedObjectContext时,您还要设置协调器,如下所示:[[self managedObjectContext] persistentStoreCoordinator]。我假设你在这里查询的托管对象上下文是以相同的方式创建的,可能是在另一个线程上。在这种情况下,进行此调用也是不安全的!

虽然问题二和三可能会导致以后出现意外行为,但问题很容易就是您的UI行为奇怪的问题。