반응형

delegate로 부모뷰컨트롤러의 함수를 호출할 수 있지만 배보다 배꼽이 더 큼

아래처럼 notificationcenter를 통하면 엄청 간단함

주로 리스트에서 글쓰기 뷰컨트롤러를 호출 후 되돌아 왔을때 리스트를 갱신해야 할때 사용하면 유용함.



// * 부모뷰 컨트롤러임 *

BOOL bDataCreate; // 데이터를 갱신해야 하는지 확인용으로 bool형 변수 하나 선언


- (void)viewDidLoad {

   bDataCreate = NO; // NO로 초기화(안해도 되지만) 

   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotiDataCreate:) name:@"NotiDataCreate" object:nil];    // noti 등록

}


- (void)viewWillAppear:(BOOL)animated {

    if (bDataCreate == YES) {   // 되돌아왔을때 YES면 데이터 갱신 후 다시 NO로 초기화

        // 데이터 갱신 (ex: data select add .... [tableview reload] )

        bDataCreate = NO;

    }

}


- (void)dealloc {   // 뷰 날라갈땐 등록한 noti 제거

    [[NSNotificationCenter defaultCenter] removeObserver:self];

}


- (void)receiveNotiDataCreate:(NSNotification *) notification {

    bDataCreate = YES;  // 자식뷰컨트롤러로 부터 변경하라는 노티가 왔다면 YES로 변경

}



// * 자식뷰컨트롤러 *

// 자식 viewcontroller에서 데이터가 추가되었을 경우 호출만 해주면 됨

[[NSNotificationCenter defaultCenter] postNotificationName:@"NotiDataCreate" object:self];







참고삼아 delegate로 호출하는 방법도 남겨둠

간단구현법!

1. 자식창(아래 포스트에선 SecondViewControllerDelegate)에서 프로토콜 및 딜리게이트 설정

1-1. 헤더

@protocol SecondViewControllerDelegate;

@interface SecondViewController : UIViewController {

 UITextField *textField;

 

 id<SecondViewControllerDelegate> delegate;

}

@property (nonatomic,assign) id<SecondViewControllerDelegate> delegate;


@end


@protocol SecondViewControllerDelegate<NSObject>;


@required


-(void) secondViewControllerInputDidEnd:(NSString *)text; <-- 요걸 마음대로 정의


@end

1-2. m

@synthesize delegate; 

[self.delegate secondViewControllerInputDidEnd:textField.text];


2.부모창(아래 포스트에선 FirstViewController)

2-1. h

자식창에서 정의된 딜리게이트를 헤어에 포함 및 해당 헤더 임포트

UIViewController<SecondViewControllerDelegate>


2-2. m

자식 딜리게이트에 셀프 할당

secondViewController.delegate = self;

자식 호출(호출 방법은 [self presentModalViewController:vc animated:YES]; 등 많음)

실질적으로 자식창에서 호출할 부모창 구현

-(void)secondViewControllerInputDidEnd:(NSString *)text{

 NSLog(@"delegate"); 

 delegateLabel.text = text;

}

반응형
Posted by Hippalus
,