如何覆盖ABNewPersonViewController中的“完成”按钮

时间:2012-02-28 10:50:14

标签: iphone ios abpersonviewcontroller

我有一个子类ABNewPersonViewController的类。据我所知,当单击导航栏中的“完成”按钮时,委托方法

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

被调用。但在进入委托方法之前,更改将保存到地址簿中。

我需要的是,只要按下保存按钮。我需要加载一个UIView,其中有2个按钮询问用户,

  1. 他是否想要改变和
  2. 他是否应该中止所做的更改,
  3. 但是,这应该在地址簿中反映出更改之前完成。只有点击UIView中的第一个按钮,才能将更改保存在地址簿中。

    单击第二个按钮,视图应该消失,我应该返回到加载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 个答案:

答案 0 :(得分:4)

更新:从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];
}