在iOS6中,我注意到新的容器视图,但不太确定如何从包含视图访问它的控制器。

场景:

我想从包含容器视图的视图控制器中访问Alert视图控制器中的标签。

它们之间有一个segue,我能用吗?


当前回答

prepareForSegue方法有效,但它依赖于segue标识符魔术字符串。也许有更好的办法。

如果你知道你要找的VC的类,你可以用一个计算属性很好地做到这一点:

var camperVan: CamperVanViewController? {
  return childViewControllers.flatMap({ $0 as? CamperVanViewController }).first
  // This works because `flatMap` removes nils
}

这依赖于childViewControllers。虽然我同意依赖第一个类可能很脆弱,但命名您所寻找的类会使这个类看起来相当可靠。

其他回答

prepareForSegue方法有效,但它依赖于segue标识符魔术字符串。也许有更好的办法。

如果你知道你要找的VC的类,你可以用一个计算属性很好地做到这一点:

var camperVan: CamperVanViewController? {
  return childViewControllers.flatMap({ $0 as? CamperVanViewController }).first
  // This works because `flatMap` removes nils
}

这依赖于childViewControllers。虽然我同意依赖第一个类可能很脆弱,但命名您所寻找的类会使这个类看起来相当可靠。

Swift编程

你可以这样写

var containerViewController: ExampleViewController?
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // you can set this name in 'segue.embed' in storyboard
    if segue.identifier == "checkinPopupIdentifierInStoryBoard" {
        let connectContainerViewController = segue.destinationViewController as ExampleViewController
        containerViewController = connectContainerViewController
    }
}

使用generic,你可以做一些甜蜜的事情。下面是Array的扩展:

extension Array {
    func firstMatchingType<Type>() -> Type? {
        return first(where: { $0 is Type }) as? Type
    }
}

你可以在你的viewController中这样做:

var viewControllerInContainer: YourViewControllerClass? {
    return childViewControllers.firstMatchingType()!
}

在视图控制器的类型上使用Swift的switch语句还有另一种方法:

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
  switch segue.destination
  {
    case let aViewController as AViewController:
      self.aViewController = aViewController
    case let bViewController as BViewController:
      self.bViewController = bViewController
    default:
      return
  }
}

你可以这样写

- (IBAction)showDetail:(UIButton *)sender {  
            DetailViewController *detailVc = [self.childViewControllers firstObject];  
        detailVc.lable.text = sender.titleLabel.text;  
    }  
}