0

我有两个uiviewcontrollerMainViewControllerSecondaryViewControlle。在MainViewController我做:

[self.view addSubView:SecondaryViewControlle.view];

SecondaryViewController是通过按下要执行的功能的按钮MainViewController。怎么做?

4

2 回答 2

1

您首先要在 SecondViewControlle.h 文件中定义一个协议,例如:

@protocol SecondViewControlleDelegate

- (void) doSomething

@end

您还需要在delegate您的 SecondViewControlle .h 文件中添加一个 "" ivar。这将是代表线:

@interface SecondViewControlle : UIViewController

...
...
...

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

...
...
...
@end 

然后,当您从 MainViewController 创建/实例化您的 SecondaryViewControlle 时,请确保将 MainViewController 添加为委托,如下所示:

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

现在delegate,您的 SecondaryViewControlle 视图控制器的“”指向您的 MainViewController。

当按下按钮时,您可以简单地执行以下操作:

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

现在,我需要在这里给你一些建议。

1) 不要使用类名作为对象名。不要将对象命名为“ SecondViewControlle”,而是将其命名为不同的名称(并以小写字母开头,这是 Objective-C 约定),例如“ moreDetailVC”。

2)我已经告诉过你如何使用委托模式来做到这一点,但这可能不是你想要做的任何事情的最合适的方式。毕竟,MainViewController 对象(应该重命名mainVC以将对象与类区分开来)不在屏幕上或不可见,所以也许有更好的地方来放置功能?

于 2013-04-13T20:49:32.350 回答
0

选项 A
更快,更容易,但缺乏可维护性,因为没有合同规定 SecondaryViewController 需要费心调用任何东西,而 self.parentViewController 可以是任何 UIViewController。

选项 B
委托模式;这是我的偏好,很明显正在发生什么,需要什么,并且有一个很好的可靠合同规定,如果你想初始化我,给我一个代表。

选项 C
如果 SecondaryViewController 必须通知多个对象,使用 NSNotificationCenter 会很快,但与选项 A 一样,没有合同,如果您需要通知许多对象,则需要记住监听这些对象的通知 -由于这不是问题,我不会详细说明,它只是在这里提供信息

选项 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];
}


SecondaryViewController.h 中的 选项 B

@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 = _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
    }
}
于 2013-04-13T21:01:34.490 回答