这很难说,但我有一个包含容器视图的视图控制器(vc1)(我正在使用故事板)。在该容器视图中是导航控制器和根视图控制器(vc2)。
从vc2中我如何才能访问vc1?
或者,如何将vc1传递给vc2? (请记住我正在使用故事板)。
答案 0 :(得分:51)
您可以在Vc1中使用prepareForSegue
方法,因为当ContainerViewController成为子级时会发生嵌入segue。你可以将自己作为一个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;
}
}
编辑:次要代码修复
答案 1 :(得分:17)
要从子视图控制器中访问父视图控制器,您必须覆盖 didMoveToParentViewController :
- (void)didMoveToParentViewController:(UIViewController *)parent {
[super didMoveToParentViewController:parent];
//Use parent
}
On Xcode Command +点击此方法获取更多信息:
这两个方法是公共的,用于在子进程之间转换时调用的容器子类 控制器。如果它们被覆盖,则覆盖应确保调用超级。中的父参数 当孩子从父母那里被移走时,这两种方法都是零;否则它等于新的 父视图控制器。
addChildViewController:在添加之前调用[child willMoveToParentViewController:self] 儿童。但是,它不会调用didMoveToParentViewController:。预计容器视图 控制器子类将在转换到新子项之后进行此调用,或者在 没有过渡的情况下,调用addChildViewController后立即:同样 removeFromParentViewController:在删除之前不调用[self willMoveToParentViewController:nil] 儿童。这也是容器子类的责任。容器子类通常会定义 通过首先调用addChildViewController:然后执行a来转换为新子节点的方法 转换将新子视图添加到其父视图层次结构中,最后将调用 didMoveToParentViewController :.类似地,子类通常会定义一个删除子进程的方法 首先调用[child willMoveToParentViewController:nil]。
答案 2 :(得分:10)
您可以使用Bonnie使用的相同方法使用委托。这是你如何做到的:
在你的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
}
}
答案 3 :(得分:10)
将属性parentViewController
用作self.parentViewController
答案 4 :(得分:2)
感谢Bonnie告诉我该怎么做。事实上,准备segue方法是可行的方法。
我只是在澄清这里的代码和步骤。
首先,在故事板中将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内部会略有不同。
答案 5 :(得分:1)
1)在VC2上公开一个属性,用于传入对VC1的引用
//VC2.h
#import "VC1.h"
@interface VC2 : NSObject
@property (strong, nonatomic) VC1 *parent;
@end
2)在VC1上,在将segue的标识符设置为“ToVC2”后,将self传递到prepareForSegue方法中VC2中公开的属性。然后像这样传递引用:
//VC1.m
@implementation VC1
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if([segue.identifier isEqualToString:@"ToVC2"]) {
VC2 *vc2 = segue.destinationViewController;
vc2.parent = self;
}
}
答案 6 :(得分:0)
Swift-一种替代方法是在父UIViewController(vc1)中创建对子/子视图UIViewController(vc2)的引用,并在vc2中创建对vc1的引用。在下面的parent(vc1)viewDidLoad()示例中分配引用。
父级UIViewController vc1:
class vc1: UIViewController {
@IBOutlet weak var parentLabel: UILabel!
var childVc2: vc2?;
overide func viewDidLoad() {
super.viewDidLoad();
// Use childViewControllers[0] without type/class verification only
// when adding a single child UIViewController
childVc2 = self.childViewControllers[0] as? vc2;
childVc2?.parentVc1 = self
}
}
子UIViewController vc2:
class vc2: UIViewCortoller {
var parentVc1: vc1?;
// At this point child and parent UIViewControllers are loaded and
// child views can be accessed
override func viewWillAppear(_ animated: Bool) {
parentVc1?.parentLabel.text = "Parent label can be edited from child";
}
}
在情节提要中,请记住在Identity Inspector中将父UIViewContoller类设置为vc1,将子UIViewContoller类设置为vc2。 Ctrl +从vc1 UIViewController中的“容器视图”拖动到vc2 UIViewController中,然后选择“嵌入”。