http://cafe.naver.com/mcbugi/21370  에 올린 델리게이트에 관한 내용에 이어서 이번에는 노티피케이션에 관한 내용을


적어 봅니다.. 이전과 마찬가지로 가장 심플한 수준의 코드로 샘플코드를 만들 것이니 복잡한 활용법은 스스로 문서등을 참조해서


깨우치도록(?) 하세요..


델리게이트와 마찬가지로 NSNotification도 오브젝트간의 통신을 위한 많은 방법들 중에 하나입니다. Delegate보다 사용법은 


심플하고 강력하지만 잘못쓰면 코드가 엉망이 될 위험부담도 큰 놈입니다. 개념은 매우 단순합니다. 노티피케이션 센터란놈에


특정 메세지를 등록해두고 이 메세지가 불리어지면 다른 여러 오브젝트에 등록된 옵져버들이 메세지에 반응해서 이벤트를 


처리해주는 식입니다. 노티피케이션의 강력한점은 동시에 여러오브젝트에 메세지를 전달한다는 점입니다. 



자 그럼 샘플코드를 만들어 보도록 합시다.  


텝바 베이스로 4개의 뷰컨트롤러를 가진 프로그램입니다. 각각의 뷰컨트롤러간에는 아무런 연관 관계도 없고 1번 뷰컨트롤러에서


메세지를 보내면 2,3,4번 뷰컨트롤러가 노티피케이션 옵져버에 의해서 메소드를 불러와서 값이 갱신되도록 하겠습니다.



먼저 4개의 뷰컨트롤러를 가진 프로그램을 만들었습니다. 이동은 탭바로 하지만 아무것도 없으니 너무 허전하내요..






일단 1번 뷰컨트롤러에는 텍스트 필드를 만들고 2,3,4번에는 1번 뷰컨트롤러의 텍스트 필드에 입력한 텍스트 값이 2,3,4번에


노티피케이션에 의해서 동시에 갱신되도록 만들겠습니다.






먼저 1번 뷰 컨트롤러 입니다.


init함수에 텍스트 필드 하나를 위치시켰습니다.



FirstViewControllert.m

-(id) init{

self = [superinit];

if (self != nil) {

 

textField = [[UITextFieldallocinitWithFrame:CGRectMake(101030025)];

textField.delegate = self;

textField.borderStyle = UITextBorderStyleRoundedRect;

[self.view addSubview:textField];

 

}

returnself;

}


그리고 텍스트필드에서 완료를 누르면 키보드가 사라지면서 값을 저장하기 위해서 델리게이트 함수를 구현했습니다.


-(BOOL) textFieldShouldReturn:(UITextField *)_textField{

 

//키보드내리기

[_textField resignFirstResponder];

 

//파라메터로넘길텍스트필드의스트링을딕셔너리에넣습니다

NSDictionary *dic = [NSDictionarydictionaryWithObject:_textField.textforKey:@"inputText"];

 

//노티피케이션센터에라벨을갱신하라고메세지를보냅니다파라메터는 NSTimer처럼 userInfo를이용해서텍스트필드의내용을파라메터로보내줬습니다보통 NSDictionary타입으로보내줍니다

NSNotificationCenter *nc = [NSNotificationCenterdefaultCenter];

[nc postNotificationName:@"saveTextFieldText"object:selfuserInfo:dic];

 

returnYES;

}



키보드의 완료 버튼을 누르면 키보드가 내려가면서 입력받은 텍스트를 노티피케이션 센터에 saveTextFieldText 

메시지와 함께 전송을 합니다. 

**메세지는노티센터에서공통으로쓰기때문에될수있으면구체적이고알기쉽게.. 나중에노티피케이션메세지가많아지면관리가 엉말이될수있습니다.


이제 노티피케이션 센터에서 보낸 메세지에 반응하도록 다른 뷰컨트롤러들을 수정해 줍시다.



SecondViewController.m


-(id) init{

self = [superinit];

if (self != nil) {

 

notificationLabel = [[UILabelallocinitWithFrame:CGRectMake(101030025)];

notificationLabel.backgroundColor = [UIColorblueColor];

[self.viewaddSubview:notificationLabel];

 

NSNotificationCenter *nc = [NSNotificationCenterdefaultCenter];

[nc addObserver:selfselector:@selector(saveText:) name:@"saveTextFieldText"object:nil];

 

}

returnself;

}


addObserver소드로 노티피케이션 센터에서 해당 메시지(saveTextFieldText)가 넘어오면 saveText: 메소드가 핸들링되게 설정을 해놨습니다.

다른 뷰컨트롤러도 동일하게 등록해주면 됩니다.


-(void)saveText:(NSNotification *)note{

NSString *text = [[note userInfoobjectForKey:@"inputText"];

notificationLabel.text = text;

}


실제 노티피케이션으로 메시지가 넘어왔을때 핸들링 하는 함수입니다. note의 userInfo는 이전에 userInfo로 넘긴 정보가 그대로 들어있으니


파라메터로 받아와서 라벨의 텍스트를 갱신 시켰습니다.



실제로 잘 작동하는 가볼까요?





노티피케이션 메세지가 잘넘어가는군요~ 잘만 활용하면 강력한 노티피케이션을 간단하게 이용해봤습니다. 그밖에 응용은 적당히


잘하시기 바랍니다, 그럼 이만 물러갑니다.

 

 

출처 : http://cafe.naver.com/mcbugi/21589

Posted by 떡공이
,