Метод делегата ABNewPersonViewController не вызывается, когда запускается действие кнопки

Я использую ABNewPersonViewController. Я сохраняю кнопку «Готово» (rightBarButtonItem из 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. Это когда метод делегата не запускается. Во всех остальных случаях срабатывает метод делегата. Теперь есть предложения?


person Xavi Valero    schedule 16.03.2012    source источник
comment
Вы говорите, что вызываете действие своей кнопки из другого представления. Вы уверены, что defaultRightBarButtonItem не освобождается, когда вы пытаетесь его вызвать?   -  person MrTJ    schedule 21.03.2012
comment
Иногда метод выполняется, иногда нет. Будут ли это проблемы с релизом?   -  person Xavi Valero    schedule 21.03.2012
comment
Это может быть легко некоторая ситуация параллелизма, особенно если ваш объект автоматически освобождается. Поставьте точку останова в этой строке и попытайтесь поймать случай, когда он не вызовет селектор. Или вы можете записать значение указателя defaultRightBarButtonItem перед вызовом этой строки.   -  person MrTJ    schedule 21.03.2012
comment
Не могли бы вы предоставить код для NSLog defaultRightBarButtonItem. Благодарность   -  person Xavi Valero    schedule 21.03.2012
comment
Ну, я не знаю тип вашего класса, но NSLog(@"%@", self.defaultRightBarButtonItem) должен выполнять работу в большинстве случаев. Если - (NSString *)description не переопределен вашим классом, он напечатает значение указателя.   -  person MrTJ    schedule 21.03.2012
comment
Я попытался зарегистрировать `NSLog(@%@, self.navigationItem.rightBarButtonItem);` и `NSLog(@%@, self.doneButton.target);` и получил <UIBarButtonItem: 0xf6c9560> <MyViewController: 0x8542430> в журнале.   -  person Xavi Valero    schedule 21.03.2012
comment
Это может быть даже допустимо, поскольку указатели (шестнадцатеричные числа) не равны нулю. Попробуйте увидеть, когда ваши селекторы не вызываются, если значение указателей также было != 0.   -  person MrTJ    schedule 21.03.2012
comment
Сделал это. Все работает нормально, кроме запускаемого метода.   -  person Xavi Valero    schedule 21.03.2012
comment
Таким образом, код переходит к нажатию кнопки в другом представлении и обходит вызов PerformSelector, не вызывая defaultRightBarButtonItem.action?   -  person MrTJ    schedule 21.03.2012
comment
Да, верно. Это происходит, когда я редактирую, например, меняю адрес и т. Д. Но если я просто редактирую номера телефонов или адрес электронной почты, или даже если я не вношу никаких изменений и не сохраняю, метод срабатывает.   -  person Xavi Valero    schedule 21.03.2012


Ответы (2)


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

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

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

  • self.defaultRightBarButtonItem or self.defaultRightBarButtonItem.target is nil
  • self.defaultRightBarButtonItem.action is nil

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

person MrTJ    schedule 21.03.2012

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

[self saveAction:nil];
person danh    schedule 24.03.2012
comment
вызов таким образом устраняет проблему? если да, то это большой намек. - person danh; 24.03.2012