我有两个uiviewcontroller
:MainViewController
和SecondaryViewControlle
。在MainViewController
我做:
[self.view addSubView:SecondaryViewControlle.view];
SecondaryViewController
是通过按下要执行的功能的按钮MainViewController
。怎么做?
我有两个uiviewcontroller
:MainViewController
和SecondaryViewControlle
。在MainViewController
我做:
[self.view addSubView:SecondaryViewControlle.view];
SecondaryViewController
是通过按下要执行的功能的按钮MainViewController
。怎么做?
您首先要在 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
以将对象与类区分开来)不在屏幕上或不可见,所以也许有更好的地方来放置功能?
选项 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
}
}