NSOperationQueue:无法在主线程的工具栏中添加UIBarButtonItem

时间:2010-11-16 14:44:42

标签: objective-c multithreading uiviewcontroller uibarbuttonitem nsoperationqueue

在我的UIViewController中,我想在工具栏中添加一个UIBarButtonItem,但不会出现新的Button。我做错了什么?

- (void)doLogin:(NSString *)name password:(NSString *)password {
 // 1.: start the Thread:
 NSInvocationOperation *invOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(backgroundTaskLogin:) object:request];
 [self.opQueue addOperation:invOperation];
}

- (void)backgroundTaskLogin:(NSString *)request2 {
 // 2.: jump back in the Main Thread in show a cancel button in den toolbar:
 [self performSelectorOnMainThread:@selector(showCancelButton) withObject:nil waitUntilDone:NO];
}

- (void)showCancelButton {
 // 3.: add a new Cancel-Button in the Toolbar:
 UIBarButtonItem *tempButtonCancel = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelLogin)];
 NSMutableArray *myButtons = (NSMutableArray *)self.toolbarItems;
 NSLog(@"Count buttons: %d", [self.toolbarItems count]); // DEBUGGER: 2

 [myButtons addObject:tempButtonCancel];
 [tempButtonCancel release];

 NSLog(@"Count buttons: %d", [self.toolbarItems count]); // DEBUGGER: 3

 // PROBLEM: I don't see the new Toolbar-Button :-(
}

2 个答案:

答案 0 :(得分:2)

您不能依赖self.toolbarItems是一个可变数组。如果您之前为该属性分配了一个可变数组,那么可能就是这种情况,但如果您不使用文档化的界面,则不能指望视图控制器注意到属性的更改。

创建一个新数组并使用setter将其分配给toolbarItems

NSMutableArray *newToolbarItems = [NSMutableArray arrayWithArray:self.toolbarItems];
[newToolbarItems addObject:tempButtonCancel];
self.toolbarItems = newToolbarItems;

答案 1 :(得分:0)

Ole的帖子中的代码将修复你的错误,但不是因为他建议的原因(因为看起来你 成功地将一个项目添加到数组中,即使它不应该是可变的大多数时候)。在复制和修改items数组之后,您必须调用setToolbarItems:,因为UIToolbar没有检测到对其数组进行了更改。

你也可以使用setToolbarItems:animated:很好地淡化事物; - )