2013-04-13 2 views
0

두 개의 uiviewcontroller : MainViewControllerSecondaryViewControlle이 있습니다. MainViewController 나는 수행이벤트 위임

[self.view addSubView:SecondaryViewControlle.view]; 

SecondaryViewControllerMainViewController 의해 수행되는 기능을 누르면 버튼이다. 수행하는 방법? 당신은 또한 당신의 SecondViewControlle .H 파일에 "delegate"바르를 추가해야

@protocol SecondViewControlleDelegate 

- (void) doSomething 

@end 

:

답변

0

옵션 A
그것은 빠르고, 쉽게,하지만 SecondaryViewController 아무것도 호출 귀찮게 할 필요가 없다는에는 계약이 없기 때문에, 유지 보수성이 부족하고, self.parentViewController 어떤의 UIViewController 수 있습니다.

옵션 B
대리자 패턴; 이것은 나의 취향이고, 무슨 일이 일어나고 있는지, 필요한 것이 무엇인지, 그리고 당신이 나를 초기화하고 싶다면 나에게 대의원을 제공하는 좋은 단서가있다.

옵션 C
SecondaryViewController는 여러 개체를 통지하는 경우, NSNotificationCenter를 사용하여 빠른 것이지만, 옵션 A와 마찬가지로, 어떠한 계약도 없다, 당신은 당신이 기억해야 할, 많은 개체에 통보해야한다 이러한 개체에서 알림을 수신하도록 -이 문제는 아니기 때문에, 나는 세부 사항으로 가지 않을 것이다, 그렇게 같은 일을 할,

옵션 MainViewController.m 년 내의
정보에 대한 바로 여기 :

SecondaryViewController *viewcontroller = [[SecondaryViewController alloc] initWithNibName:@"SecondaryView" bundle:nil]; 
[self addChildViewController:viewcontroller]; 

//set viewcontroller.view frame 

[self.view addSubview:viewcontroller.view]; 

[viewcontroller didMoveToParentViewController:self]; 

내부 MainViewController.h

-(void) performButtonClickAction; 

내부 MainViewController.m :

-(void) performButtonClickAction { 
    //Do something constructive 
} 

다음 SecondaryViewController.m 내부 :

-(IBAction) buttonPressed:(id) sender { 
    [self.parentViewController performButtonClickAction]; 
} 

옵션 B
,내부 SecondaryViewController.h

@protocol SecondaryViewControllerDelegate <NSObject> 
-(void) eventAFromViewController:(UIViewController *) viewController; 
-(void) eventBFromViewController:(UIViewController *) viewController; 
@end 

@interface SecondaryViewController : UIViewController { 
    id<SecondaryViewControllerDelegate> delegate; 
} 

@property (assign, nonatomic) id<SecondaryViewControllerDelegate> delegate; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil delegate:(id<SecondaryViewControllerDelegate>) theDelegate; 
@end 

내부 SecondaryViewController.m @synthesize 대리자 = _delegate; 이에 시간을 낭비

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil delegate:(id<SecondaryViewControllerDelegate>) theDelegate 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     self.delegate = theDelegate; 
    } 
    return self; 
} 

-(IBAction) buttonPressed:(id) sender { 
    if(self.delegate != nil) { 
     [_delegate eventAFromViewController:self]; 
    } 
    else { 
     //No delegate 
    } 
} 
+0

을 보상해야한다. 감사 –

+0

대상에서 옵션 B를 사용하는 경우 –

1

당신처럼, 당신의 SecondViewControlle.h 파일에 어떤 프로토콜을 정의하여 시작 했죠. 이제

SecondaryViewControlle.delegate = self; 
[self.view addSubView:SecondaryViewControlle.view]; 

은 "delegate : 다음

@interface SecondViewControlle : UIViewController 

... 
... 
... 

@property (nonatomic, assign) id delegate; // all you need to do is add this line inside your interface declarations 

... 
... 
... 
@end 

, 당신은 만들 때 /과 같이 대리자로 MainViewController을 추가 특정하게, 당신의 MainViewController에서 SecondaryViewControlle를 인스턴스화 : 대리자 줄 것 "는 SecondaryViewControlle보기 컨트롤러의 MainViewController를 다시 가리 킵니다.

그리고 버튼을 누르면, 당신은 단순히 같은 것을 수행 할 수 있습니다

- (IBAction) buttonIsPressed: (id) sender 
{ 
    [delegate doSomething]; 
} 

지금, 여기 당신에게 몇 가지 조언을 줄 필요가 있습니다.

1) 은 객체 이름으로 클래스 이름을 사용하지 마십시오. "SecondViewControlle"이라는 객체를 갖는 대신 다른 이름을 지정하고 (예 : Objective-C 규칙 인 소문자로 시작) "moreDetailVC"과 같은 이름을 지정하십시오.

2) 위임 패턴을 사용하여이 작업을 수행하는 방법을 설명했지만이 작업이 수행하려고하는 작업을 수행하는 가장 적절한 방법은 아닙니다. 결국, MainViewController 객체 (클래스와 객체를 구별하기 위해 mainVC으로 이름을 바꿔야 함)가 화면에 없거나 표시되지 않기 때문에 기능을 추가하기에 더 좋은 곳이 있습니까?

+1

+1 는 모든 노력은 항상 없음 위임 작동 – Eugene