如何覆盖ABNewPersonViewController中的"Done"按钮



我有一个类,它是ABNewPersonViewController的子类。据我所知,当单击导航栏中的"完成"按钮时,代理方法

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

接到电话。但在输入委托方法之前,更改将保存到通讯簿中。

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

  1. 他是否想要改变
  2. 他是否应该中止所做的更改

但这应该在地址簿中反映这些变化之前完成。只有单击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];
}
}

我正在加载一个带有UIAlertViewUIView

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

最新更新