2010-07-22 3 views
1

UIView간에 정보를 전달하는 가장 쉬운 방법은 무엇입니까? 두 개의 독립 실행 형보기를 탐색 모음에서 밀고 팝하는 경우 두 번째 UIview에서 단추를 눌렀을 때 하나의 UIview에서 원하는 일부 논리를 원합니다.두 개의 독립적 인 UIView간에 메시지 전달

대리인을 사용하는 것이 올바른 방법입니까? 또는 인터페이스 작성기와 함께 간단한 방법이 있습니까? 여기

UIViewController *secondVC = [[UIViewController alloc] initWithDelegate:firstVC callback:callback]; 

[firstVC.navigationController pushViewController:secondVC animated:YES]; 
+0

나는 명확하지 않다. 한편으로는 UIView간에 정보를 전달하는 방법을 묻습니다 (UIView가 아니라 UIViewController를 의미한다고 가정합니다). 반면에 다른 버튼을 눌렀을 때 논리를 수행하는 방법을 묻는 중입니다. 당신이하려는 일에 대해 더 자세하게 설명해 줄 수 있습니까? – jlehr

답변

0

가장 쉬운 방법은 대리자를 사용하는 것입니다

감사 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에서 해제해야합니다.

+0

그래서이 코드에서 firstVC 함수를 호출 할 수 있습니까? 어떻게 secondVC 버튼을 firstVC에 연결합니까 일반 위임자와 같은 프로토콜을 구현해야합니까? – Amir

+0

당신은 프로토콜을 할 수 있습니다. 또는 메서드에서 : buttonClicked :, 전화, [self.delegate performSelector : @selector (callback)] – vodkhang

+0

엄청난 과용. 두 번째보기 컨트롤러의 속성을 설정하지 않는 이유는 무엇입니까? – jlehr

0

가있다 : 는 내가 함께 secondViewController init을,

+1

이 예제와 설명에 대한 다른 모든 내용은 훌륭하지만 여기서는 할당 의미론의 사용이 매우 잘못되었으며 잠재적 인 크래셔 버그입니다. 또한 Apple의 문서에서는 NSString에 retain 대신 copy를 사용하는 것이 좋습니다 (전달 된 인스턴스가 변경 될 수있는 경우). – jlehr

+0

기본 객체가 사용자 밑으로 풀린 경우 잠재적 인 크래셔 버그가 발생합니다. 그리고 "복사"의미론을 사용하면 두 뷰 컨트롤러간에 동일한 객체에 대한 포인터를 공유하는 전체적인 의미가 파괴됩니다. –

1

정확하게 이것은 응답 체인을위한 것입니다. iPhone의 모든 UIView 및 UIViewController는 UIResponder의 하위 클래스입니다. 또한 UIViews와 UIViewController는 모두 자동으로 응답자 체인에 추가됩니다.

응답 체인은 응답자간에 메시지를 보내는 방법입니다.객체에 직접 메시지를 보내거나 응답 체인에 메시지를 전달할 수 있습니다. 이 기능은 UIButton에 자동으로 구현됩니다.

당신은 당신이 그렇게 같은 버튼의 대상으로 뷰 2를 추가 할 수 있습니다 뷰 2에 대한 참조가있는 경우 : 당신이 참조가없는 경우

[button addTarget:view2 action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 

당신과 같이 버튼에 대상을 추가 할 수 있습니다

[button addTarget:nil action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 

대상을 nil로 설정하면 선택자는 buttonClicked: 선택기에 응답하는 응답자가 발견 될 때까지 반응 체인을 지나치게됩니다.

자세한 내용은 UIControl documentationUIResponder documentation을 참조하십시오.

0

나는 NSUserDefaults을 사용합니다. App에 지정된 Item을 저장하고 다음보기에서 실행하고 첫 번째보기로 돌아 가면 다시 시작할 수 있습니다! 예를 들어 ...


//Saving the file - use in the first view controller 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:somedataobject]; 
[prefs setObject:colordata forKey:@"DataKey"] 

//Recalling the file - use in 2nd view 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
NSData *objectData = [prefs objectForKey:@"DataKey"]; 
Object *someobject = [NSKeyedUnarchiver unarchiveObjectWithData:objectData]; 

이제 데이터가 NSInteger, NSString 또는 부울 값이 아니라고 가정합니다. 이 경우 다음을 사용 : 선언에 대한 [prefs setInteger: forKey:]; [prefs setBool: forKey:];[prefs IntegerforKey:] [prefs BoolforKey:] 를 리콜합니다.

위 구문은 doubles and floats에도 적용됩니다.

관련 문제