안녕하세요. 이번 포스팅 주제는 '서로 다른 뷰 간의 데이터 전달' 입니다. 전달 방법은 4가지 정도로 간추려 볼 수 있습니다.
|
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가지 입니다. 이후 추가할 내용이 있으면 날짜를 기재하고 추가하도록 하겠습니다.
※해당 포스팅은 지극히 주관적인 내용으로 저자의 복기 목적으로 작성된 것이고, 내용에대해 수정이나 추가 요청은 언제든 환영합니다.
'아이폰 > 개발일지' 카테고리의 다른 글
[iOS - Swift] cocoaPods로 라이브러리 추가 ( SnapKit 추가, 안드 개발자 시점 ) (0) | 2021.07.12 |
---|---|
[Objective-C] 커스텀 팝업 만들기 (2) | 2018.01.08 |
[Objective-c] CocoaPods 사용하기 (0) | 2017.12.20 |
[Objective-C] 메소드 기초 (0) | 2017.12.08 |
[Objective-C] 클래스 기초 (0) | 2017.12.06 |