2014-01-21 305 views

回答

49

您可以使用Vc1中的prepareForSegue方法,因为当ContainerViewController成为子对象时会发生嵌入延迟。您可以将自己作为obj传递或存储对孩子的引用以供以后使用。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    NSString * segueName = segue.identifier; 
    if ([segueName isEqualToString: @"embedseg"]) { 
     UINavigationController * navViewController = (UINavigationController *) [segue destinationViewController]; 
     Vc2 *detail=[navViewController viewControllers][0]; 
     Vc2.parentController=self; 
    } 
} 

编辑:小的代码修复

+0

@Firula行'的UINavigationController * navViewController =(UINavigationController *)[segue destinationViewController];'不会初始化任何东西,只有指向已经存在的指针初始化控制器。 – Bonnie

+1

因此,首先命名故事板中将容器视图连接到其第一个视图控制器的segue(链接)。我将它命名为“toContainer”。 然后在含有容器视图中添加本方法的视图控制器 - (无效)prepareForSegue:(UIStoryboardSegue *)赛格瑞发件人:(ID)发送方 { 如果([segue.identifier isEqualToString:@ “toContainer”]) UINavigationController * navViewController =(UINavigationController *)[segue destinationViewController]; UIViewController * vc2 = [navViewController viewControllers] [0]; } } vc2是我想要参考的控制器。 –

+0

注意:destinationViewController已经是我的容器嵌入目标UIViewController – BananaAcid

2

谢谢邦尼告诉我该怎么做。事实上,准备赛格方法是一条路。

我只是澄清代码和步骤在这里。

因此,首先命名故事板中将容器视图连接到其第一个视图控制器的segue(链接)。我将它命名为“toContainer”。

然后在包含容器视图的视图控制器添加此方法

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString: @"toContainer"]) { 
     UINavigationController *navViewController = (UINavigationController *) [segue destinationViewController]; 
     UIViewController *vc2 = [navViewController viewControllers][0]; 
    } 
} 

所以VC2是我希望得到参考控制器。

这对我有效,如果你的第一个viewconroller不是导航控制器,你的方法在prepareForSegue里面会稍微不同。

+3

您可以将我的答案标记为正确,并在评论中添加您的更好的说明。 – Bonnie

+0

Mark,您需要将Firula's或Bonnie的答案标记为正确,然后继续编辑您的问题并在问题中提供这些有用的信息。 – Fattie

17

要从孩子视图控制器中访问父视图控制器,你必须覆盖didMoveToParentViewController

- (void)didMoveToParentViewController:(UIViewController *)parent { 
    [super didMoveToParentViewController:parent]; 

    //Use parent 
} 

在Xcode的命令+点击了此方法的详细信息:

这两种方法在子控制器之间转换时,容器子类是公用的。如果它们被覆盖,覆盖应该确保调用超级。 这两个方法中的父参数是零,当一个孩子被从其父母移除;否则它等于新的父视图控制器 。

addChildViewController:在添加 孩子之前将调用[child willMoveToParentViewController:self]。但是,它不会调用didMoveToParentViewController :.预计容器视图 控制器子类将在转换到新子项之后进行此调用,或者在调用addChildViewController后立即在不进行转换的情况下进行调用。同样, removeFromParentViewController:在删除 子项之前,不会调用[self willMoveToParentViewController:nil]。这也是容器子类的责任。容器子类通常会定义 一种方法,该方法首先调用addChildViewController,然后执行一个 转换,该转换将新子视图添加到其父视图层次结构中,最后将调用 didMoveToParentViewController :.同样,子类通常会定义一种方法,通过首先调用[child willMoveToParentViewController:nil]以相反的方式移除 中的子项。

1

上VC2 1)露出的属性用于在引用传递到上VC1 VC1

//VC2.h 
#import "VC1.h" 

@interface VC2 : NSObject 
@property (strong, nonatomic) VC1 *parent; 
@end 

2),通过自成在prepareForSegue方法在VC2露出的属性您设置您赛格瑞的标识符之后到“ToVC2”。然后通过参考如下:

//VC1.m 
@implementation VC1 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
if([segue.identifier isEqualToString:@"ToVC2"]) { 
    VC2 *vc2 = segue.destinationViewController; 
    vc2.parent = self; 
} 
} 
8

您可以使用邦尼使用相同的方法委派。这里是你如何做到这一点:

在你containerViews的ViewController:

class ContainerViewViewController: UIViewController { 
    //viewDidLoad and other methods 

    var delegate: ContainerViewControllerProtocol? 

    @IBAction func someButtonTouched(sender: AnyObject) { 
    self.delegate?.someDelegateMethod() //call this anywhere 
    } 

} 

protocol ContainerViewControllerProtocol { 
    func someDelegateMethod() 
} 

在你父母的ViewController:

class ParentViewController: UIViewController, ContainerViewControllerProtocol { 
    //viewDidLoad and other methods 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "filterEmbedSegue" { 
      let containerViewViewController = segue.destinationViewController as ContainerViewViewController 

      containerViewViewController.delegate = self 
     } 
    } 

    func someDelegateMethod() { 
     //do your thing 
    } 
} 
8

使用属性parentViewControllerself.parentViewController

+7

在我的情况下,这不起作用self.parentViewController是零。我在故事板中添加了containerView,然后将相关的视图控制器类设置为我的特定子类。我期望parentViewController被设置为包含容器视图的VC,但这不会自动设置。我不得不使用上面的-prepareForSegue解决方案 –

+0

属性是“自我”。父母“在迅速3 –

相关问题