这是棘手的词,但我有一个视图控制器(vc1),其中包含一个容器视图(我正在使用故事板)。在该容器视图内是一个导航控制器和一个根视图控制器(vc2)。从容器视图中的视图控制器中,如何访问包含容器的视图控制器?
从vc2中我怎样才能访问vc1?
或者,我如何将vc1传递给vc2? (记住我正在使用故事板)。
这是棘手的词,但我有一个视图控制器(vc1),其中包含一个容器视图(我正在使用故事板)。在该容器视图内是一个导航控制器和一个根视图控制器(vc2)。从容器视图中的视图控制器中,如何访问包含容器的视图控制器?
从vc2中我怎样才能访问vc1?
或者,我如何将vc1传递给vc2? (记住我正在使用故事板)。
您可以使用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;
}
}
编辑:小的代码修复
谢谢邦尼告诉我该怎么做。事实上,准备赛格方法是一条路。
我只是澄清代码和步骤在这里。
因此,首先命名故事板中将容器视图连接到其第一个视图控制器的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里面会稍微不同。
要从孩子视图控制器中访问父视图控制器,你必须覆盖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]以相反的方式移除 中的子项。
上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;
}
}
您可以使用邦尼使用相同的方法委派。这里是你如何做到这一点:
在你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
}
}
使用属性parentViewController
为self.parentViewController
在我的情况下,这不起作用self.parentViewController是零。我在故事板中添加了containerView,然后将相关的视图控制器类设置为我的特定子类。我期望parentViewController被设置为包含容器视图的VC,但这不会自动设置。我不得不使用上面的-prepareForSegue解决方案 –
属性是“自我”。父母“在迅速3 –
@Firula行'的UINavigationController * navViewController =(UINavigationController *)[segue destinationViewController];'不会初始化任何东西,只有指向已经存在的指针初始化控制器。 – Bonnie
因此,首先命名故事板中将容器视图连接到其第一个视图控制器的segue(链接)。我将它命名为“toContainer”。 然后在含有容器视图中添加本方法的视图控制器 - (无效)prepareForSegue:(UIStoryboardSegue *)赛格瑞发件人:(ID)发送方 { 如果([segue.identifier isEqualToString:@ “toContainer”]) UINavigationController * navViewController =(UINavigationController *)[segue destinationViewController]; UIViewController * vc2 = [navViewController viewControllers] [0]; } } vc2是我想要参考的控制器。 –
注意:destinationViewController已经是我的容器嵌入目标UIViewController – BananaAcid