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

场景:

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

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


当前回答

是的,你可以使用segue来访问子视图控制器(及其视图和子视图)。使用Storyboard中的Attributes检查器给segue一个标识符(比如alertview_embed)。然后让父视图控制器(包含容器视图的控制器)实现如下方法:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   NSString * segueName = segue.identifier;
   if ([segueName isEqualToString: @"alertview_embed"]) {
       AlertViewController * childViewController = (AlertViewController *) [segue destinationViewController];
       AlertView * alertView = childViewController.view;
       // do something with the AlertView's subviews here...
   }
}

其他回答

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

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

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

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

如果有人正在寻找Swift 3.0,

viewController1, viewController2等等都是可访问的。

let viewController1 : OneViewController!
let viewController2 : TwoViewController!

// Safety handling of optional String
if let identifier: String = segue.identifier {

    switch identifier {

    case "segueName1":
        viewController1 = segue.destination as! OneViewController
        break

    case "segueName2":
        viewController2 = segue.destination as! TwoViewController
        break

    // ... More cases can be inserted here ...

    default:
        // A new segue is added in the storyboard but not yet including in this switch
        print("A case missing for segue identifier: \(identifier)")
        break
    }

} else {
    // Either the segue or the identifier is inaccessible 
    print("WARNING: identifier in segue is not accessible")
}

是的,你可以使用segue来访问子视图控制器(及其视图和子视图)。使用Storyboard中的Attributes检查器给segue一个标识符(比如alertview_embed)。然后让父视图控制器(包含容器视图的控制器)实现如下方法:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   NSString * segueName = segue.identifier;
   if ([segueName isEqualToString: @"alertview_embed"]) {
       AlertViewController * childViewController = (AlertViewController *) [segue destinationViewController];
       AlertView * alertView = childViewController.view;
       // do something with the AlertView's subviews here...
   }
}

自我。当你需要父控件时,childViewControllers更相关。例如,如果子控制器是一个表视图,你想要强制重载它或通过点击按钮或父视图控制器上的任何其他事件来改变属性,你可以通过访问ChildViewController的实例来实现,而不是通过prepareForSegue。两者都有不同的应用方式。

你可以简单地使用self.childViewControllers.lastObject(假设你只有一个子对象,否则使用objectAtIndex:)。