본문 바로가기

프로그래밍/iOS

[iOS] iPhone(아이폰) 데이타 전송 (뷰간의 데이터 전달 :직접전달, 델리게이트(Delegate), 노티피케이션, UserDefaults)

1. property를 통한 객체 직접 전달

객체를 만들고 값을 전달하는 간단한 방법.


받는 부분

//.h 파일
@interface
ReceiveData : UIViewController {
NSString *test;
}
@property (nonatomic, assign) NSString *test;@end

//.m파일
@synthesize test;


보내는 부분

//.h파일 임포트하고 객체 생성후 값을 넣어준다.
#import
"ReceiveData.h" @interface SendData : UIViewControlle{
ReceiveData *reData;}
//.m파일 필요한 부분에 적용시킨다.
reData
= [[ReceiveData alloc]initWithNibName:@"ReceiveData" bundle:nil];
reData
.test = @"test good";




SendData에서 ReceveData에 대한 객체를 만든 후 데이터를 넘겨 줌


2. 델리게이트 ( Delegate )

객체에 델리게이트를 설정하면 모든 상호작용 메시지는 델리게이트로 전해지며, 상호작용에 대한 응답할 책임을 델리게이트가 갖는다. UITableView를 보면 사용자가 열을 클릭 했을 때 델리게이트 메소드를 활용하여 메시지를 전달하는 것을 알 수 있다. (tableView:didSelectRowAtIndexPath: 사용) 델리게이트를 해석하면 '대리자' 이며 해석한 그대로 대리자의 역할을 한다. (개인적인 얕은 지식으로 java에서 인터페이스와 비슷하다고 생각된다.)


선언 .h 파일 (업케스팅이라고 생각하시면 됩니다.)

#import <UIKit/UIKit.h>

//델리게이트를 사용하기 위한 프로토콜 선언
@protocol
SendDataDelegate;

@interface SendData : UIViewController {

//프로토콜을 따르는 id값을 선언
id<SendDataDelegate>delegate;

}
//다른 클래스에서도 접근 하기 때문에 프로퍼티로 선언해주어야 합니다. 당연히 .m파일에 @synthesize delegate; 추가
@property (nonatomic, assign) id<SendDataDelegate>delegate;
@end

@protocol SendDataDelegate <NSObject>;
@required
//프로퍼티를-(void)SendNumber:(NSInteger)nBer1 withNum:(NSInteger)nBer2;
@end


.m 파일


@synthesize delegate;
//델리게이트를 사용할 위치에 사용합니다. number1과 number2는 호출부로 넘어가서 사용됩니다.
[self.delegate SendNumber:number1 withNum:number2];

//프로토콜이 있는 해더파일을 임포트 시켜줍니다.
#import
"SendData.h"

//SendDataDelegate의 프로토콜을 따르겠다는 선언을 합니다.@interface
Coupon : UIViewController<SendDataDelegate>{
SendData *sd;
}//객체를 초기화 하고 델리게이트를 호출하도록 합니다.
sd = [[SendData alloc]initWithNibName:@"SendData" bundle:nil];
sd.delegate = self;

//호출부를 구현 합니다.
-(void)SendNumber:(NSInteger)nBer1 withNum:(NSInte

ger)nBer2{

NSInteger getNber = nBer1 - nBer2;
NSLog(@"%d",getNber);
}





3. 노티피케이션 ( Notification )

모델과 뷰 사이의 상호작용과 이벤트 전달 방식중 하나이다. 어플리케이션 내부 통신 뿐만 아니라 다른 어플리케이션과의 통신에서도 사용된다. 노티피케이션의 가장 장점은 동시에 여러 객체에 정보를 전달하는것이 가능하다는 것이다. 노티피케이션을 이용하면 다른 어플리케이션에서 상태 메시지를 브로드 케스팅할 수 있다. (아직 해보지 않았다.) 객체에서 메시지를 무시할 수도 있고 받을 수도 있는데 받으려면 노티피케이션 센터에 등록을 해야 한다. NSNotificationCenter가 내부 노티피케이션 표준이며 이것을 사용하지 않은 어플리케이션은 엡스토어에 올라가지 않는다. 노티피케이션 센터를 통하여 원하는 메시지를 볼 수도 있고 수신 할 수도 있다. 노티피케이션은 key값으로 메시지를 찾는다.


등록 (보내기)

//보낼 딕셔너리를 만들고 키값을 입력한다
NSDictionary *dic = [NSDictionary dictionaryWithObject:textData.text forKey:@"InputText"];

//노티피케이션 센터를 등록한다.
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
//key값과 딕셔너리 그리고 노티피케이션의 이름을 함께 등록한다.
[nc postNotificationName:@"saveTextFieldText" object:self userInfo:dic];



받기 (옵저버)

//노티피케이션센터를 등록한다.
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
//
saveTextFieldText메시지가 발생 시 작동하며 셀렉터는 함수를 사용한다 viewText는 아래와 같다.
[nc addObserver:self selector:@selector(viewText:

) name:@"saveTextFieldText" object:nil];

-(void) viewText:(NSNotification *)noText{
// 딕셔너리에 대한 정보를 받고 키값으로 값을 찾아 등록한다.
NSString *ncText = [[[noText userInfo] objectForKey:@"InputText"] retain];
NSLog("ncText = @%",ncText);

}




4. UserDefault

UserDefault를 사용하게 되면 저장된 값은 어플리케이션을 삭제 하지 않는 이상 계속해서 저장된다. 즉 어플리케이션을 재시작 하여도 그 값은 저장되어 있다. 쉽게 생각하면 한번 설정한 변수는 수정 전까지 계속해서 어플리케이션 내부에 남아 있는 것이다. UserDefault는 key값으로 호출을 하는데 사용 방법은 다음과 같다.

불러오기

[[NSuserDefaults standardUserDefaults] valueForKey:(NSString *)];

ex)

[NSUserDefaults standardUserDefaults]valueForKey:@"Key"];
NSString *receiveData =
[NSUserDefaults standardUserDefaults]valueForKey:@"Key"];


저장

[[NSuserDefaults standardUserDefaults] setValue:(id) forKey:(NSString *)];

ex)
NSString *sendData = @"send";

[[NSUserDefaults standardUserDefaults] setValue:sendData forKey:@"testKey"]


보내고 받을 수 있는 형식은 value, float 등 여러 형식이 있으며 저장된 형식에 따라서 불러오는 형식이 달라진다.


출처 : http://whitegom.tistory.com/11