呈现视图控制器的最佳方式

詹卢卡

我正在研究多个框架,我的问题只是一个“哲学”问题。

我创建了一个实用函数来显示视图控制器

static func presentViewController(identifier: String, storyboardName: String = "Main", presentationStyle: UIModalPresentationStyle = .fullScreen){
    let storyboard = UIStoryboard(name: storyboardName, bundle: InternalConstants.bundle)
    var viewResult: UIViewController
    if #available(iOS 13.0, *) {
        viewResult = storyboard.instantiateViewController(identifier: identifier)
    } else {
        viewResult = storyboard.instantiateViewController(withIdentifier: identifier)
    }
    viewResult.modalPresentationStyle = presentationStyle
    var top = UIApplication.shared.keyWindow?.rootViewController
    while top?.presentedViewController != nil {
       top = top!.presentedViewController
    }
    top!.present(viewResult, animated: true, completion: nil)
}

首先,这是呈现视图控制器的正确方法还是有更好的方法?

那么,在导航控制器中呈现视图控制器是否更好?

穆罕默德

首先,这是呈现视图控制器的正确方法还是有更好的方法?

只要它的工作,然后它是正确的,它只是你做这个具体事情的方式,但它做的是一个正确的事情iOSUIKit角度来看,答案是否定它通常是通过观察来呈现的viewController一件坏事rootViewController's presentedViewController,因为它不能保证最后presentedViewController你会发现是一件好事,现在的它,你不会知道,直到它打破,这presentedViewController可能是一个UISearchController,如果你使用的UIContentContainer还是ContainerView从故事板,你可能有一个小的viewController,这只是一个UISlider在最后,这可能不利于 viewController 的出现和消失

您将面临的另一个问题是,当您需要将数据传入和传出使用这种方法呈现的 viewController 时,您甚至没有对正在呈现的 viewController 的引用,因为您只传递了一个 identifier

从一个MVC角度来看,您永远不应该尝试UIView通过直接从您的视图调用您的函数来从 a 呈现 viewController那是不好的做法

如果你看一看的UIKitSDK,如果你曾经尝试提出任何系统UIViewController,你必须实例化和呈现VC例如责任,你会发现UIImagePickerControllerUIActivityViewControllerUIDocumentPickerViewControllerUIDocumentMenuViewControllerUIPrinterPickerControllerUIVideoEditorController

Apple 自己没有去提供一个功能来展示他们的系统 vcs

相反,如果你正在开发一个框架并且不想让用户访问你的 viewControllers 你应该让你自己的窗口并给它一个 rootViewController

Apple 也有很多这方面的例子,AuthenticationServices出于安全原因,在框架中你不应该引用 safari 网络浏览器,他们有一些东西叫做ASWebAuthenticationSession通过调用start()cancel()函数来控制呈现和关闭 Safari Web ViewController 的流程

此外,您的框架的用户并不总是希望使用默认的演示动画呈现您的 viewController,他们可能想要使用自定义 viewContollers 动画,他们需要访问transitioningDelegateviewController 上的属性

想象一下,UIViewController如果您采用这种方法将无法访问所有公共有用的属性

那么,在导航控制器中呈现视图控制器是否更好?

至于这部分,在 navigationController 上显示任何内容都可以

故事板令人头疼至于故事板初始化令人头疼,有很多文章在谈论优化故事板初始化调用站点,我建议您做这样的事情

extension UIStoryboard {
    enum AppStoryBoards: String {
        case
        login,
        main,
        chat,
        cart
    }

    convenience init(_ storyboard: AppStoryBoards, bundle: Bundle? = nil) {
        self.init(name: storyboard.rawValue.prefix(1).capitalized + storyboard.rawValue.dropFirst(), bundle: bundle)
    }
}

通过这种方式,您可以使用enum来初始化故事板,从而将呼叫站点改进为这样

let login = UIStoryboard.init(.login)

那么你可以有另一个像这样的视图控制器初始化扩展

extension UIStoryboard {
    func instantiateInitialVC<T: UIViewController>() -> T {
        return self.instantiateInitialViewController() as! T
    }

    func instantiateVC<T: UIViewController>(_: T.Type) -> T {
        return self.instantiateViewController(withIdentifier: String(describing: T.self)) as! T
    }
}

然后你可以这样称呼它

let loginVC = UIStoryboard.init(.login).instantiateInitialVC()

或这个

let loginVC = UIStoryboard.init(.login).instantiateVC(LoginViewController.self)

通过这样做,您可以改进用于呈现任何 viewController 的整体代码

let dvc = UIStoryboard.init(.login).instantiateVC(LoginViewController.self)
dvc.plaplapla = "whatever"
present(dvc, animated: true)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

关闭模态视图控制器时如何保持呈现视图控制器的方向?

快速以编程方式呈现视图控制器

使用Swift快速以编程方式在当前上下文上呈现当前视图控制器

在tvOS中呈现视图控制器

使用3D Touch Peek&Pop时,以模式方式呈现提交视图控制器,而不是推送

从呈现的视图控制器访问呈现的视图控制器?

在呈现的视图控制器上的UITableViewCell中呈现UIAlertController

模态呈现视图控制器

使用自动布局以编程方式呈现弹出视图控制器

以编程方式快速呈现新的视图控制器/以编程方式为类提供标识符

在SwiftUI中呈现视图控制器

Swift:以模态方式呈现视图控制器时,背景色发生了变化

为什么我的视图控制器(从情节提要中以情节方式呈现)在被解雇后仍未释放?

将数据传递给视图控制器时,以模态方式呈现该控制器时是否有所不同?

如何从UITableViewCell呈现视图控制器

呈现视图控制器之上的模态视图控制器

呈现子视图控制器时,UINavigationController不会旋转

在导航堆栈中以模态方式呈现视图控制器

自动呈现视图控制器

从呈现的弹出视图控制器推送视图控制器

iOS - 从呈现的视图控制器呈现视图控制器会改变其高度

Swift:选择器在以编程方式呈现其视图控制器时抛出错误

以模态方式呈现嵌入在导航控制器中的视图控制器,与标签栏控制器分开

如何从呈现的视图控制器上的按钮操作推送视图控制器

关闭视图控制器的最佳方法?

更改呈现的视图控制器约束

视图控制器不会立即关闭并呈现新的视图控制器

Laravel 在视图中调用控制器的最佳方式?

当视图控制器嵌入到导航控制器中时,以模态方式呈现选项卡栏视图?