如何检查具有指定标识符的视图控制器是否可用
How to check View controller is available with specified identifier or not
在我的应用程序标识符中,来自服务器,我们将它们用作视图控制器标识符。在这里,我想检查具有指定标识符的 ViewController 是否可用。如果可用,则仅推送到该控制器,否则仅推送 return。我写了如下代码。
let identifier = Constants.menuSections[indexPath.section-1][indexPath.row-1]
if let vc1 = (self.storyboard?.instantiateViewController(withIdentifier:identifier)){
let navi = BaseNaviViewController(rootViewController:vc1)
navi.navigationBar.tintColor = .white
navi.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
sideMenuController?.embed(centerViewController:navi, cacheIdentifier:identifier)
}else {
return
}
这里我收到一条错误消息
Terminating app due to uncaught exception
'NSInvalidArgumentException', reason: 'Storyboard () doesn't contain a view controller with identifier
'abc''
您可以像这样将所有标识符存储在枚举中:
enum Identifier: String {
case viewcontroller
var storyboardName: String {
switch self {
case .viewcontroller : return "Main"
}
}
}
if let validIdentifier = Identifier(rawValue: "vc") {
let storyboard = UIStoryboard(name: validIdentifier.storyboardName, bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: validIdentifier.rawValue)
}
如果标识符不存在,此方法将 return 为 nil,因此只需使用 NSAssert 检查即可。
如果我没记错的话,您正在尝试根据 storyboard identifier
实现动态屏幕重定向,并且您从数组中获得 storyboard_id
。
早些时候,我遇到过同样的需求,也遇到过同样的问题。不幸的是,如果 storyboard_id
不存在,则没有停止崩溃的解决方案。
当时,我添加了一个空的storyboard_id
if destination ViewController is not available,在重定向之前,我检查了storyboard_id
是否为空,然后跳过重定向代码。
代码:
let identifier = Constants.menuSections[indexPath.section-1][indexPath.row-1]
if identifier.count == 0{
return
}else{
let vc1 = (self.storyboard?.instantiateViewController(withIdentifier:identifier))
let navi = BaseNaviViewController(rootViewController:vc1)
navi.navigationBar.tintColor = .white
navi.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
sideMenuController?.embed(centerViewController:navi, cacheIdentifier:identifier)
}
谢谢
终于找到解决方法了
extension UIStoryboard {
func instantiateVC(withIdentifier identifier: String) -> UIViewController? {
// "identifierToNibNameMap" – dont change it. It is a key for searching IDs
if let identifiersList = self.value(forKey: "identifierToNibNameMap") as? [String: Any] {
if identifiersList[identifier] != nil {
return self.instantiateViewController(withIdentifier: identifier)
}
}
return nil
}
}
而且我已经使用了如下这种方法
let identifier = Constants.menuSections[indexPath.section-1][indexPath.row-1]
if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateVC(withIdentifier: identifier) {
let navi = BaseNaviViewController(rootViewController:viewController)
navi.navigationBar.tintColor = .white
navi.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
sideMenuController?.embed(centerViewController:navi, cacheIdentifier:identifier)
}
else {
ServerService.ShowAlertMessage(ErrorMessage: "No controller Available", title: "Oops . . . !", view: self)
}
在我的应用程序标识符中,来自服务器,我们将它们用作视图控制器标识符。在这里,我想检查具有指定标识符的 ViewController 是否可用。如果可用,则仅推送到该控制器,否则仅推送 return。我写了如下代码。
let identifier = Constants.menuSections[indexPath.section-1][indexPath.row-1]
if let vc1 = (self.storyboard?.instantiateViewController(withIdentifier:identifier)){
let navi = BaseNaviViewController(rootViewController:vc1)
navi.navigationBar.tintColor = .white
navi.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
sideMenuController?.embed(centerViewController:navi, cacheIdentifier:identifier)
}else {
return
}
这里我收到一条错误消息
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Storyboard () doesn't contain a view controller with identifier 'abc''
您可以像这样将所有标识符存储在枚举中:
enum Identifier: String {
case viewcontroller
var storyboardName: String {
switch self {
case .viewcontroller : return "Main"
}
}
}
if let validIdentifier = Identifier(rawValue: "vc") {
let storyboard = UIStoryboard(name: validIdentifier.storyboardName, bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: validIdentifier.rawValue)
}
如果标识符不存在,此方法将 return 为 nil,因此只需使用 NSAssert 检查即可。
如果我没记错的话,您正在尝试根据 storyboard identifier
实现动态屏幕重定向,并且您从数组中获得 storyboard_id
。
早些时候,我遇到过同样的需求,也遇到过同样的问题。不幸的是,如果 storyboard_id
不存在,则没有停止崩溃的解决方案。
当时,我添加了一个空的storyboard_id
if destination ViewController is not available,在重定向之前,我检查了storyboard_id
是否为空,然后跳过重定向代码。
代码:
let identifier = Constants.menuSections[indexPath.section-1][indexPath.row-1]
if identifier.count == 0{
return
}else{
let vc1 = (self.storyboard?.instantiateViewController(withIdentifier:identifier))
let navi = BaseNaviViewController(rootViewController:vc1)
navi.navigationBar.tintColor = .white
navi.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
sideMenuController?.embed(centerViewController:navi, cacheIdentifier:identifier)
}
谢谢
终于找到解决方法了
extension UIStoryboard {
func instantiateVC(withIdentifier identifier: String) -> UIViewController? {
// "identifierToNibNameMap" – dont change it. It is a key for searching IDs
if let identifiersList = self.value(forKey: "identifierToNibNameMap") as? [String: Any] {
if identifiersList[identifier] != nil {
return self.instantiateViewController(withIdentifier: identifier)
}
}
return nil
}
}
而且我已经使用了如下这种方法
let identifier = Constants.menuSections[indexPath.section-1][indexPath.row-1]
if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateVC(withIdentifier: identifier) {
let navi = BaseNaviViewController(rootViewController:viewController)
navi.navigationBar.tintColor = .white
navi.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
sideMenuController?.embed(centerViewController:navi, cacheIdentifier:identifier)
}
else {
ServerService.ShowAlertMessage(ErrorMessage: "No controller Available", title: "Oops . . . !", view: self)
}