7

我目前正在尝试使用UIPresentationController. 我的问题是,当我的自定义转换委托调用时

func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController!, sourceViewController source: UIViewController) -> UIPresentationController? 

我的呈现控制器nil导致它抛出异常。我从嵌入在标签栏控制器中的导航控制器中的视图控制器中呈现它。我也尝试从这些控制器中将其呈现给相同的问题。当没有自定义模式演示时,它也可以正常工作,但我的目标是自定义它。我在选择按钮时调用它,代码如下所示。mapTransitionDelegate是我保留在类属性中的自定义转换委托。此外,EnlargedMapViewController()初始化为具有自定义模式表示,以便调用我的转换委托。

var enlargedMapController = EnlargedMapViewController();
enlargedMapController.transitioningDelegate = mapTransitionDelegate;
presentViewController(enlargedMapController, animated: true, completion: nil);

我很想了解为什么会在未来的知识中出现这个问题。到目前为止,UIPresentationController由于这个异常,我的子类甚至没有被初始化。

4

1 回答 1

0

UIViewController(以及它的子类)的指定初始化程序是init(nibName:bundle:). 但是,文档特别指出:

这是该类的指定初始化程序。当使用情节提要定义您的视图控制器及其关联视图时,您永远不会直接初始化您的视图控制器类。相反,视图控制器由情节提要在触发 segue 时自动实例化,或者在您的应用调用情节提要对象的 instantiateViewControllerWithIdentifier: 方法时以编程方式实例化。从故事板实例化视图控制器时,iOS 通过调用其 initWithCoder: 方法而不是此方法来初始化新的视图控制器,并将 nibName 属性设置为存储在故事板中的 nib 文件。

调用EnlargedMapViewController()不是正确的方法,因为它绕过了 Cocoa 查找片段所需的所有机制。您应该使用指定的初始化程序从 nib 实例化它,或者至少通过将其 nib 文件名与其类名(即EnlargedMapViewController.xib)匹配,这样您对EnlargedMapViewController(nibName: nil, bundle: nil)(传递 nil)的调用将导致 Cocoa 按名称寻找匹配的 nib。

但实际上,如果您在其他任何地方都使用故事板,为什么不在这里呢?只需为其场景设置一个标识符,然后使用instantiateViewControllerWithIdentifier:并享受您为自己节省的时间和烦恼。

于 2015-11-04T13:42:49.387 回答