본문 바로가기

아이폰/개발일지

[Objective-c] 뷰 간의 데이터 전달

반응형

 

안녕하세요. 이번 포스팅 주제는 '서로 다른 뷰 간의 데이터 전달' 입니다. 전달 방법은 4가지 정도로 간추려 볼 수 있습니다.

    • Property를 이용한 방법
    • Delegate를 이용한 방법
    • Notification Center를 이용한 방법
    • UserDefault 이용한 방법 



Property를 이용한 방법

 

A뷰에서 B뷰의 데이터 값을 지정해주는 방식으로 간단하지만 가독성이 다소 떨어 질 수 있습니다. 하지만  A - > B 방식으로 새롭게 쌓을 뷰에 간단한 데이터를 넘길때는 빠르고 쉬운 방법 입니다.

해당 방법에서 A는 데이터를 전달하는 뷰 , B는 데이터를 전달 받는 뷰 입니다.



B.h

 

전달 받을 데이터를 선언합니다.


   @interface PlayViewController : UIViewController  { 

}

@property (nonatomic,assign) NSString *minStr;



B.m

 헤더 파일에 선언한 데이터를 다음과 같이 작성합니다.

@interface PlayViewController (){    

}

@end

@implementation PlayViewController

@synthesize minStr;



A.m

 

아래와 같이 스토리보드에 아이디가 'Play' 인 뷰를 객체화해서 데이터 값을 설정하면 해당 뷰를 호출했을때 값이 설정된걸 확인할 수 있습니다.



#import "PlayViewController.h"

@interface PlaySettingViewController (){

}


...


PlayViewController *playViewController=[self.storyboard instantiateViewControllerWithIdentifier:@"Play"];

playViewController.minStr=minStr;




Delegate를 이용한 방법

 

델리게이트를 사용하는 방법으로 다소 번거로울 수 있으나 Property를 이용한 방법 보다는 효율적입니다. 하지만 쓰임새가 달라서 사용하실때 주의하셔야 합니다.

델리게이트는 테이블 뷰에서 열을 선택했을때의 피드백을 받을 경우와 같이 기존에 떠있는 뷰 간의 데이터 통신을 위한 용도로 사용하시면 될 거 같습니다. 그리고 Property를 이용한 방법과 무관한 독립적인 소스로 인지하셔야 이해가 편하실것 같습니다. 



A.h

 

정보를 전달할 뷰 컨트롤러에서 프로토콜을 등록하고, 델리게이트를 통해 호출할 함수도 정의합니다.



@protocol  PlayDelegate<NSObject>

@required

-(void)endPlay:(NSString *)playTime;

@end 



A.m

 

값을 전달할 특정 경우에 아래처럼 'endPlay' 메소드에 "10"을 파라미터로 실행시킵니다. 실질적 메소드 기능은 B 뷰 컨트롤러에서 정의합니다.



[self.delegate endPlay:@"10"];



B.h

 

정의한 델리게이트를 사용하기 위해 다음과 같이 작성합니다.



@interface PlaySettingViewController : UIViewController <PlayDelegate>{

     

}



B.m

 

A 뷰 컨트롤러에서 endPlay를 실행했을때 B의 정의된 기능이 실행됩니다. 그렇기 때문에 뷰 간의 통신이 가능합니다.


 

-(void)endPlay:(NSString *)playTime{

    NSLog(@"endPlay=%@",playTime);

}




Notification Cetner를 이용한 방법

 

노티피케이션 센터를 이용한 방법은 제가 생각하기엔 제일 깔끔한 방법 같습니다. 하지만 델리게이트를 이용한 방법과 같이 새로운 뷰를 불러올때 데이터를 전달하기엔 적합하지 않은 방법입니다.

A 뷰 컨트롤러가 노티피케이션 센터에 노티피케이션을 받기 위해 등록합니다.

B 뷰 컨트롤러에서 실제 데이터 값과 키 값을 담아 데이터를 전송합니다.

A 뷰 컨트롤러에서 등록된 객체와 메소드가 실행됩니다.



 



A.m

 

노티피케이션 센터에 'setPlaytimes' 가 호출되면 setPlayTime 메소드가 실행되도록 등록합니다. 


NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

[center addObserver:self selector:@selector(setPlayTime:) name:@"setPlaytimes" object:nil];

......

-(void)setPlayTime:(NSNotification *)noti{

    

    NSDictionary *notiDic=[noti userInfo];

    NSString *playTime=[notiDic objectForKey:@"playTime"];

    NSLog(@"playtime=%@",playTime);

    

}



B.m

 

playTime 에 "10" 을 담아서 노티피케이션 센터에 'setPlaytimes' 이름으로 데이터를 전송합니다.


NSString *playTime=@"10";

    

NSDictionary *notiDic=nil;

notiDic=[[NSDictionary alloc]initWithObjectsAndKeys:playTime,@"playTime", nil];

[[NSNotificationCenter defaultCenter]postNotificationName:@"setPlaytimes" object:nil userInfo:notiDic];


이렇게 실행을 하면 A 뷰 컨트롤러에서 setPlayTime 메소드가 실행됩니다.



UserDefault를 이용한 방법

 

UserDefault를 사용해 저장된 값은 어플리케이션을 삭제하지 않는 이상 계속 남아 있습니다. 어플리케이션의 설정값 등을 저장하고 불러올때 사용하시면 적절할 것 같습니다. ※저장된 데이터의 형식에 따라서 불러오는 형식이 달라집니다.



데이터 저장

 

111의 값을 time 키 값에 저장합니다.



[[NSUserDefaults standardUserDefaults]setValue:@"111" forKey:@"time"];



데이터 호출

 

time 키의 저장된 값을 담습니다.



NSString *timer=[[NSUserDefaults standardUserDefaults]valueForKey:@"time"];





제가 조사한 방법은 이상 4가지 입니다. 이후 추가할 내용이 있으면 날짜를 기재하고 추가하도록 하겠습니다.




해당 포스팅은 지극히 주관적인 내용으로 저자의 복기 목적으로 작성된 것이고, 내용에대해 수정이나 추가 요청은 언제든 환영합니다. 







반응형