2012-02-28 6 views
4

서브 클래스가 ABNewPersonViewController 인 클래스가 있습니다. 이해하는 바와 같이 탐색 메뉴의 완료 버튼을 클릭하면 위임 방법ABNewPersonViewController의 "완료"버튼을 무시하는 방법

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

이 호출됩니다. 그러나 위임 메서드에 들어가기 전에 변경 내용이 주소록에 저장됩니다.

내가 원하는 것은 저장 버튼을 누르 자마자. 나는 그가 변화와 그 변경 사항을 취소할지 여부를

  • 을 원하는지

    1. ,이 개 버튼은 사용자 요청으로 UIView을로드

    필요하지만이 변경되기 전에 수행해야합니다 주소록에 반영됩니다. 그리고 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을로드하고 있습니다.

  • 답변

    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]; 
    } 
    
    +0

    내가 저장 버튼을 트리거하고 있지 않다 '- (void) actionSave : (UIBarButtonItem *) sender' 메소드 내부의 액션. 대신 버튼이있는 다른 뷰를로드하고 있습니다. 그리고보기 중 하나의 단추를 클릭하면 다른보기가로드됩니다. 이보기에서 버튼을 클릭하면 저장 버튼 동작을 트리거해야합니다. 이 작업을 수행 할 때까지 완료된 버튼의 할당이 취소됩니다. 내가 직면하고있는 문제가 그 것이다. –

    +1

    필요하다면 컨트롤러가 할당 해제되지 않도록 어딘가에서 ABNewPersonViewController 인스턴스에 대한 강력한 (유지 된) 참조를 유지하려고 시도 했습니까? – Jilouc

    +0

    나는 –