2012-03-16 4 views
2

Я использую ABNewPersonViewController. Я коплю на кнопку Готово (rightBarButtonItem из ABNewPersonViewController) к другой кнопке, так что метод делегатаМетод делегата ABNewPersonViewController не вызывается при запуске действия кнопки

- (void)newPersonViewController:(ABNewPersonViewController *)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person 

не дозвонились, пока сделано не будет нажата кнопка. Мой viewDidLoad метод заключается в

- (void)viewDidLoad { 
[super viewDidLoad]; 


self.defaultRightBarButtonItem = self.navigationItem.rightBarButtonItem; 

UIBarButtonItem *saveBtn = [[UIBarButtonItem alloc] 
          initWithBarButtonSystemItem:UIBarButtonSystemItemSave 
          target:self 
          action:@selector(actionSave:)]; 
self.navigationItem.rightBarButtonItem = saveBtn; 
[saveBtn release]; 
} 

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

[self.defaultRightBarButtonItem.target 
performSelector:self.defaultRightBarButtonItem.action 
withObject:self.defaultRightBarButtonItem.target]; 

Иногда метод вызывается, а иногда и не работает. Если я просто отредактировал поле адреса электронной почты или номер телефона контакта и попытаюсь его сохранить, метод будет вызван. Но если я попытаюсь изменить поля адреса, а затем сохранить, метод не будет вызван. Что может быть причиной этого.

Редактировать: обнаружено, что метод делегата не запускается при загрузке нового представления. И это происходит (новый просмотр загружен), только когда такие поля, как Country, Ringtone редактируются. То, когда метод делегата не запускается. Во всех других случаях метод делегата запускается. Теперь любые предложения?

+0

Вы говорите, что вы вызываете действие своей кнопки с другого вида. Вы уверены, что defaultRightBarButtonItem не будет выпущен при попытке вызвать его? – MrTJ

+0

Иногда метод выполняется, иногда это не так. Будут ли проблемы с выпуском? –

+1

Это может быть легко ситуация параллелизма, особенно если ваш объект автореализован. Поместите точку останова в эту строку и попытайтесь поймать случай, когда он не будет вызывать селектор. Или вы можете записать значение указателя defaultRightBarButtonItem перед вызовом этой строки. – MrTJ

ответ

2

performSelector эквивалентно вызову метода объекта, которому он отправлен. Если выполнение переходит к «нажатием кнопки в другой вид» обработчика и выполняет код

[self.defaultRightBarButtonItem.target 
performSelector:self.defaultRightBarButtonItem.action 
withObject:self.defaultRightBarButtonItem.target]; 

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

  • self.defaultRightBarButtonItem или self.defaultRightBarButtonItem.target является nil
  • self.defaultRightBarButtonItem.action является nil

Вместо performSelector попытайтесь вызвать метод actionSave: и запишите все поля выше.

0

Мои 2 цента: Ничто в вопросе не указывает на ошибку. Но почему такой круглый вызов вызывает метод сохранения (выполнение действия кнопки сохранения на цели кнопки сохранения). Как насчет:

[self saveAction:nil]; 
+0

Клиентские требования. –

+0

действительно ли это устраняет проблему? если это так, это большой намек. – danh

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