NSOperationQueue: невозможно добавить UIBarButtonItem на панели инструментов в главном потоке - PullRequest
1 голос
/ 16 ноября 2010

В моем UIViewController я хочу добавить UIBarButtonItem на панели инструментов, но новая кнопка не появляется.Что я делаю не так?

- (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 ]

2 голосов
/ 16 ноября 2010

Нельзя полагаться на self.toolbarItems как изменяемый массив. В вашем случае это может быть один случай, если вы ранее назначили изменяемый массив этому свойству, но вы не можете ожидать, что контроллер представления заметит изменение свойства, если вы не используете документированный интерфейс.

Создайте новый массив и используйте установщик, чтобы присвоить его toolbarItems:

NSMutableArray *newToolbarItems = [NSMutableArray arrayWithArray:self.toolbarItems];
[newToolbarItems addObject:tempButtonCancel];
self.toolbarItems = newToolbarItems;
0 голосов
/ 16 ноября 2010

Код в сообщении Оле исправит вашу ошибку, но не по той причине, которую он предлагает (поскольку кажется, что вы успешно добавляете элемент в массив, даже если это не должно быть изменяемым больше всего времени). Вы должны вызвать setToolbarItems: после дублирования и изменения массива элементов, потому что UIToolbar не обнаруживает, что изменения были внесены в его массив в противном случае.

Вы также можете использовать setToolbarItems:animated:, чтобы красиво выцветать; -)

...