0

我有一个嵌入视图,在另一个视图中,我将如何在 Childs viewController 中获取父 viewController 的当前实例,需要它在当前实例上调用父级上的方法。

这就是我当前在父级上调用该方法的方式,这会分配一个新实例。

CalendarMonthViewParent *controller = [[CalendarMonthViewParent alloc] init];
[controller callChildChange];

我得到“没有可见的界面声明”callChildChange”,如果我这样称呼它:

[self.parentViewController callChildChange];

编辑1:

CalendarMonthViewParent.h

#import <UIKit/UIKit.h>

@interface CalendarMonthViewParent : UIViewController

-(void) callChildChange;

@property (strong, nonatomic) IBOutlet UINavigationItem *skemaNavigationItem;

@end

CalendarMonthViewParent.m

- (void)callChildChange { // this is called from the child

   UINavigationItem *navBar = [self skemaNavigationItem];
   NSLog(@"logging navItem: %@", navBar); // this logs null when called from the child, since its called on a new instance and not the old one, if i call this from the parent directly, it is not null

}

CalendarMonthViewChild.m

- (void) calendarMonthView:(TKCalendarMonthView*)monthView didSelectDate:(NSDate*)date{
NSLog(@"Date Selected: %@",date);

...

CalendarMonthViewParent *controller = [[CalendarMonthViewParent alloc] init];
[controller callChildChange]; // this calls it on a new instance, i need it to call it on the existing instance

...

}
4

3 回答 3

3

直接叫self.parentViewController孩子ViewController

于 2013-08-10T12:44:42.920 回答
0

据我所知,您试图获取 parentViewController 的实例只是为了发送消息“你好,我是你的 childViewController,我被改变了”。

与其这样做,我建议您实现一个ChildViewControllerDelegate协议,并更改您的 ParentViewController 以使其符合该协议。

然后,在您的 childViewController 中,您需要调用类似[delegate childViewControllerChanged:self];

但我不知道如何为视图控制器设置委托,它不是以编程方式添加的。如果你知道怎么做 - 祝你好运:)

于 2013-08-10T13:31:24.323 回答
0

我通过从“自定义容器视图控制器 -添加和删除子项”示例列表中获取注释 1 和 3 的行来实现这一点:

- (void) displayContentController: (UIViewController*) content;
{
   [self addChildViewController:content];                 // 1
   content.view.frame = [self frameForContentController]; // 2
   [self.view addSubview:self.currentClientView];
   [content didMoveToParentViewController:self];          // 3
}

并将它们放入容器控制器类的 prepareForSegue:sender: 中,在情节提要中嵌入了视图控制器。

因此

 NDOMasterViewController *viewController = (NDOMasterViewController *)[segue destinationViewController];
    [self addChildViewController:viewController];                 // 1
    [viewController didMoveToParentViewController:self];          // 3

现在在嵌入式视图控制器中,我可以使用 self.parentViewController。

于 2013-11-07T20:45:19.427 回答