2014-02-16 8 views
0

В раскадровке я создал DetailViewController с UIToolbar внизу и одной кнопкой.Как сменить программные кнопки UIToolbar, если они созданы в Storyboard?

Есть особые времена, когда я хочу представить этот контроллер вида с помощью альтернативного набора кнопок.

Когда я хочу представить модально вид контроллера с дополнительными кнопками, я должен инициализировать контроллер представления программно из раскадровки так:

DetailViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"Detail"]; 

[controller newButtons:YES]; 
[self presentViewController:controller animated:YES completion:nil]; 

В файле DetailViewController.m У меня есть метод, который называется выше:

-(void) newButtons: (BOOL) isNew 
{ 
    if (isNew) { 
     UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] 
            initWithBarButtonSystemItem:UIBarButtonSystemItemDone 
            target:self 
            action:@ selector(save:)]; 

     UIBarButtonItem *cancelItem = [[UIBarButtonItem alloc] 
             initWithBarButtonSystemItem:UIBarButtonSystemItemCancel 
             target:self 
             action:@ selector(cancel:)]; 

     NSArray *buttonArr = [[NSArray alloc] initWithObjects:doneItem, cancelItem, nil]; 

    [self.toolbar setItems:buttonArr animated:YES]; 


    } 
} 

Я создал выход из раскадровки к DetailViewController.m файл, щелкнув увлекая в верхней части файла, который сделал:

@property (weak, nonatomic) IBOutlet UIToolbar *toolbar; 

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

Почему нет новых кнопок. Я зарегистрировал тестовый оператор из метода newButtons, и он вызывает его наверняка. Просто не добавляя кнопки ???

UPDATE:

я добавил точку останова [self.toolbar setItems: анимированный] и не назвал заявление, даже если метод был вызван. self.toolbar - null.

Как это выглядит? Я нажимаю cntrl-click в верхнюю часть DetailViewController.m и добавляет его. Я пробовал как сильные, так и слабые свойства.

+0

Установите контрольную точку на линии, где вы называете 'setItems: анимированные:' 'на self.toolbar'. Подтвердите, что точка останова достигнута, а затем убедитесь, что 'self.toolbar' не' nil'. – rmaddy

+0

Я добавил точку останова в [self.toolbar setItems: animated], и она не вызывала оператор, хотя метод был вызван. self.toolbar - null. Почему это null? Я cntrl-click перетащил в верхнюю часть DetailViewController.m и сделал его сильным указателем? – nearpoint

ответ

0

А я узнал ответ! Контроллер представления не инициализирован, пока вы его не представите!

Так что мне просто пришлось переключить порядок кода. Когда я назвал:

[controller newButtons:YES]; 

перед вызовом:

[self presentViewController:controller animated:YES completion:nil]; 

self.toolbar не был инициализирован.

Мне пришлось сначала представить контроллер просмотра, а затем сам.панель инструментов появилась

[self presentViewController:controller animated:YES completion:nil]; 
[controller newButtons:YES]; 

Спасибо @Avt & @rmmaddy за помощь мне отладить

0

Изменить

@property (weak, nonatomic) IBOutlet UIToolbar *toolbar; 

в

@property (strong, nonatomic) IBOutlet UIToolbar *toolbar; 

Также добавьте

NSLog(@"%@", self.toolbar); 

методу newButtons, чтобы проверить, что панель является действительным.

+0

Я пробовал это, и ничего не изменилось. Такая же ошибка. Оператор журнала печатает нуль. Панель инструментов недействительна, почему? Из раскадровки я перетащил прямо в верхнюю часть файла и создал для меня выход. – nearpoint

+0

Так проблема в недопустимой панели инструментов. Извините, но для меня недостаточно информации, чтобы предложить вам кое-что. – Avt

Смежные вопросы