가장 쉬운 방법은 대리자를 사용하는 것입니다
감사 IB에서 동일한보기에없는 행동에 버튼을 드래그 할 수 있다는 사실을 알고 쉬운 일. 이것이 얼마나 간단 할 수 있는지 생각할 준비가 되셨습니까?
:
@interface VCOne : UIViewController {
NSString *mystring;
}
@property (nonatomic, retain) NSString *mystring;
@end
VCOne.m
@implementation VCOne
@syntheize mystring;
-(void)viewDidLoad {
//you probably wouldn't do it here, but just so it has a
//place to live, I'm doing it in viewDidLoad...
VCTwo *two = [[VCTwo alloc] initWithNibName:@"VCTwoView" bundle:nil];
two.mystring = self.mystring;
[self.navigationController pushViewController:two animated:YES];
[two release];
}
-(void)dealloc {
[mystring release];
[super dealloc];
}
VCTwo.h VCOne.h을 :
다음 코드는 두 개의 뷰 컨트롤러 사이에 데이터 객체를 공유하는 방법을 보여줍니다
@interface VCTwo : UIViewController {
NSString *mystring;
}
//nb the "assign" in the following line where you're probably
//used to seeing "retain"!!
@property (nonatomic, assign) NSString *mystring;
@end
VC 2 :
@implementation VCTwo
@synthesize mystring;
-(void)viewDidLoad {
self.mystring = @"I set this string inside VCTwo!";
}
-(void)dealloc {
[super dealloc];
}
그래, 그럼! 하나의보기 컨트롤러는 * mystring이라는 NSString을 가지고 있으며 retain
setter 의미로 @property로 선언합니다. 두 번째는 * mystring이라는 NSString을 가지고 있으며 assign
세터를 가진 @property로 선언한다. (중요하게는 -(void)dealloc
에서 해제하지 않는다.) 이것은 이전의 VC에 의존하지 만 메모리 안전하다. 현재 대상에서 멀리 떨어진 대상!).
첫 번째 VC가 두 번째 VC를 인스턴스화하면 새로운 VC의 필드에 mystring 필드를 할당합니다. 새로운 VC는 해당 객체를 받아들이고 자체적으로 @property
에 할당합니다. 이제 VCTwo에서 변수에 대해 수행하는 작업은 VCOne에서 언급 된 값에서 발생합니다. 문자 그대로 포인터를 공유하고 있습니다. 두보기 컨트롤러는 동일한 메모리 조각에 핸들을 가지고 있습니다.
왜 VCTwo 안에 retain
을 사용하지 않으시겠습니까? retain
이라고 할 때 합성 된 setter 메서드는 변수가 설정되면이를 지우고 재설정합니다. 그것들은 별도의 객체가되어 실제로 동기화되지 않습니다. 뷰 컨트롤러간에 값을 전달할 수는 있지만 참조는 할 수 없습니다.
메모리 경고의 결과로 업스트림으로 출시되어 객체가 사라져서 문제가 발생하는 경우 언제든지 명시 적으로 [mystring retain]
으로 전화를 걸어 둘 수 있습니다. 그렇게 할 경우 -(void)dealloc
에서 해제해야합니다.
나는 명확하지 않다. 한편으로는 UIView간에 정보를 전달하는 방법을 묻습니다 (UIView가 아니라 UIViewController를 의미한다고 가정합니다). 반면에 다른 버튼을 눌렀을 때 논리를 수행하는 방법을 묻는 중입니다. 당신이하려는 일에 대해 더 자세하게 설명해 줄 수 있습니까? – jlehr