我正在研究多个框架,我的问题只是一个“哲学”问题。
我创建了一个实用函数来显示视图控制器
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)
}
首先,这是呈现视图控制器的正确方法还是有更好的方法?
那么,在导航控制器中呈现视图控制器是否更好?
首先,这是呈现视图控制器的正确方法还是有更好的方法?
只要它的工作,然后它是正确的,它只是你做这个具体事情的方式,但它做的是一个正确的事情iOS
和UIKit
角度来看,答案是否定它通常是通过观察来呈现的viewController一件坏事rootViewController's
presentedViewController
,因为它不能保证最后presentedViewController
你会发现是一件好事,现在的它,你不会知道,直到它打破,这presentedViewController
可能是一个UISearchController
,如果你使用的UIContentContainer
还是ContainerView
从故事板,你可能有一个小的viewController,这只是一个UISlider
在最后,这可能不利于 viewController 的出现和消失
您将面临的另一个问题是,当您需要将数据传入和传出使用这种方法呈现的 viewController 时,您甚至没有对正在呈现的 viewController 的引用,因为您只传递了一个 identifier
从一个MVC
角度来看,您永远不应该尝试UIView
通过直接从您的视图调用您的函数来从 a 呈现 viewController那是不好的做法
如果你看一看的UIKit
SDK,如果你曾经尝试提出任何系统UIViewController
,你必须实例化和呈现VC例如责任,你会发现UIImagePickerController
,UIActivityViewController
,UIDocumentPickerViewController
,UIDocumentMenuViewController
,UIPrinterPickerController
,UIVideoEditorController
Apple 自己没有去提供一个功能来展示他们的系统 vcs
相反,如果你正在开发一个框架并且不想让用户访问你的 viewControllers 你应该让你自己的窗口并给它一个 rootViewController
Apple 也有很多这方面的例子,AuthenticationServices
出于安全原因,在框架中你不应该引用 safari 网络浏览器,他们有一些东西叫做ASWebAuthenticationSession
通过调用start()
和cancel()
函数来控制呈现和关闭 Safari Web ViewController 的流程
此外,您的框架的用户并不总是希望使用默认的演示动画呈现您的 viewController,他们可能想要使用自定义 viewContollers 动画,他们需要访问transitioningDelegate
viewController 上的属性
想象一下,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] 删除。
我来说两句