Как я могу переопределить кнопку «Готово» в ABNewPersonViewController - PullRequest
4 голосов
/ 28 февраля 2012

У меня есть класс, который подклассы ABNewPersonViewController.Как я понимаю, при нажатии кнопки «Готово» на панели навигации вызывается метод делегата

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

.Но перед вводом метода делегата изменения будут сохранены в адресной книге.

Что мне нужно, так это как только кнопка сохранения будет нажата.Мне нужно загрузить UIView с 2 кнопками, спрашивающими пользователя:

  1. , хочет ли он изменений и
  2. , следует ли ему прервать внесенные изменения,

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

При нажатии 2-й кнопки вид должен исчезнуть, и я должен вернуться к классу контроллера вида, из которого загружен UIView.

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

Я создал пользовательскую кнопку сохранения

UIBarButtonItem *okBtn =  self.navigationItem.rightBarButtonItem;
UIBarButtonItem *saveBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:okBtn.target action:okBtn.action];
self.navigationItem.rightBarButtonItem =saveBtn;
[saveBtn release];

При действии кнопки сохранения элемент управления переходит к делегатуМетод

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

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

Редактировать: Когда я загружаюABNewPersonViewController

 ABPersonViewController *displayVcardViewController = (ABPersonViewController*)[self.navigationController visibleViewController];

ABRecordRef person = displayVcardViewController.displayedPerson;

EditAddressNewPersonDetailViewController *newVCardViewController = [[EditAddressNewPersonDetailViewController alloc] init];
newVCardViewController.displayedPerson = person;
newVCardViewController.newPersonViewDelegate = self;
newVCardViewController.isEditingMode = YES;

[self.navigationController setToolbarHidden:YES];
[self.navigationController pushViewController:newVCardViewController animated:YES];
[newVCardViewController release];

Разве это не сильная ссылка или нет Где я должен включить сильную ссылку.

Вкл.

- (void)actionSave:(UIBarButtonItem *)sender {

if([[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil]) { 
    [self.myView setFrame:CGRectMake(0, 0, 320, 480)];

    [[UIApplication sharedApplication].keyWindow addSubview:self.myView];

           UIActionSheet * action = [[UIActionSheet alloc]initWithTitle:@""
                                                              delegate:self
                                                     cancelButtonTitle:@"Do"
                                                destructiveButtonTitle:@"Cancel"
                                                     otherButtonTitles: nil];
           action.tag = 101; 
          [action showInView:self.view];
          [action release];
}

}

Я загружаю UIView с UIAlertView над ним.

1 Ответ

4 голосов
/ 13 марта 2012

Обновление : Начиная с iOS 7.0, ABNewPersonViewController больше не является подклассом, и это не будет работать.

Во-первых, сохраняйте ссылку на значение по умолчанию rightBarButtonItem, прежде чем переопределять его.,Если вы создаете подклассы ABNewPersonViewController, ваш viewDidLoad будет выглядеть так:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Store the old button item into a custom property
    // @property (nonatomic, retain) UIBarButtonItem *defaultRightBarButtonItem;

    self.defaultRightBarButtonItem = self.navigationItem.rightBarButtonItem;

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

И вы вызываете действие по умолчанию для цели по умолчанию в вашем методе настраиваемого действия:

- (void)actionSave:(UIBarButtonItem *)sender {

    // Do what you want to do before the data is saved
    // ....
    // ....

    // Trigger the default action
    [self.defaultRightBarButtonItem.target 
     performSelector:self.defaultRightBarButtonItem.action
     withObject:self.defaultRightBarButtonItem.target];
}
...