use*_*485 6 uiviewcontroller ios swift uipresentationcontroller
我目前正在尝试使用a呈现视图控制器UIPresentationController
.我的问题是,当我的自定义转换委托调用时
func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController!, sourceViewController source: UIViewController) -> UIPresentationController?
Run Code Online (Sandbox Code Playgroud)
我的呈现控制器nil
导致它抛出异常.我是从嵌入在导航控制器中的视图控制器中呈现它的,该控制器嵌入在标签栏控制器中.我试过从这些控制器中提出同样的问题.当没有自定义模式演示时它也可以正常工作,但我的目标是自定义它.我选择一个按钮并在下面提供代码时调用它.mapTransitionDelegate
是我保留在类属性中的自定义转换委托.此外,EnlargedMapViewController()
初始化为具有自定义模式演示文稿,以便调用我的转换委托.
var enlargedMapController = EnlargedMapViewController();
enlargedMapController.transitioningDelegate = mapTransitionDelegate;
presentViewController(enlargedMapController, animated: true, completion: nil);
Run Code Online (Sandbox Code Playgroud)
我很想知道为什么这个问题是为了未来的知识而发生的.截至目前,UIPresentationController
由于此异常,我的子类甚至没有被初始化.
UIViewController(及其子类)的指定初始值设定项是init(nibName:bundle:)
。然而,文档明确指出:
这是该类的指定初始值设定项。当使用故事板定义视图控制器及其关联视图时,您永远不会直接初始化视图控制器类。相反,视图控制器会在触发 segue 时由 Storyboard 自动实例化,或者在您的应用程序调用 Storyboard 对象的 instantiateViewControllerWithIdentifier: 方法时以编程方式实例化。当从故事板实例化视图控制器时,iOS 通过调用其 initWithCoder: 方法而不是此方法来初始化新的视图控制器,并将 nibName 属性设置为存储在故事板内的 nib 文件。
调用EnlargedMapViewController()
并不是正确的方法,因为它绕过了 Cocoa 查找碎片所需的所有机制。您应该使用其指定的初始值设定项从 nib 实例化它,或者至少通过将其 nib 文件名与其类名(即EnlargedMapViewController.xib
)匹配,这样您的调用EnlargedMapViewController(nibName: nil, bundle: nil)
(传递 nil)将导致 Cocoa 通过名称寻找匹配的 nib。
但实际上,如果您在其他地方都使用故事板,为什么不在这里也使用呢?只需为其场景和使用设置一个标识符instantiateViewControllerWithIdentifier:
,即可享受为自己节省的时间和烦恼。
归档时间: |
|
查看次数: |
328 次 |
最近记录: |