gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:22:52 25 4
gpt4 key购买 nike

我在 ViewDidLoad 中创建了一个自定义按钮,用于显示新 View (通过 downALevel):

UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPlay target:self action:@selector(downALevel:)];
self.navigationItem.rightBarButtonItem = addButton;

View 加载正常并且按钮工作。当我返回 View 时,按钮似乎被禁用并且无法工作。我正在使用 Xcode 6;这在以前的版本中不是问题。

有什么想法吗?

  • (IBAction)downALevel:(id)发件人{

    [ self 展示等待];

    [self PerformSelectorInBackground:(@selector(callGrouper4)) withObject:nil];

-(void)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让我们调用第一个 View A 和新 View B。我刚刚发现,如果 B 具有相同的代码来创建自定义按钮,那么 A 上的按钮将被禁用。如果 B 中没有代码,那么一切都很好。我很困惑??!!

最佳答案

看来您在这里违反了几个线程职责!

首先,您正在调用 performSelectorInBackground:,但在 callGrouper4 方法内部,您不会在推送 View Controller 之前切换回主线程。请记住,UIKit 不是线程安全的。这可能会导致像您所看到的那样的奇怪行为!

您还创建了一个 NSManagedObjectContext 而不使用 initWithConcurrencyType: api。这意味着您的托管对象上下文正在使用 NSConfinementConcurrencyType 并发类型。这意味着您不允许将此上下文传递给另一个线程,但您将它分配给新的 View Controller ,这很可能会在主线程上调用它,而不是创建它的线程。

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

虽然问题 2 和 3 以后可能会导致意外行为,但问题 1 很容易成为您的 UI 行为异常的原因。

关于ios - 导航栏上的自定义按钮停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27920671/

25 4 0