Ios 当我以编程方式切换时,UIBarButtonim将不显示
我正在构建一个应用程序,其中我以编程方式从ViewControllerA中分离,因为它是一个菜单项列表,每个菜单项都指向不同的VC,所以我没有使用多个分段,而是在代码中实例化了view controller。我的问题是,即使我的故事板上有一个条形按钮项目,它也不会显示在应用程序中 查看控制器A菜单型号代码:Ios 当我以编程方式切换时,UIBarButtonim将不显示,ios,swift,xcode,navigation,segue,Ios,Swift,Xcode,Navigation,Segue,我正在构建一个应用程序,其中我以编程方式从ViewControllerA中分离,因为它是一个菜单项列表,每个菜单项都指向不同的VC,所以我没有使用多个分段,而是在代码中实例化了view controller。我的问题是,即使我的故事板上有一个条形按钮项目,它也不会显示在应用程序中 查看控制器A菜单型号代码: class PlayerMenu: Hashable { let title: String let numberOfItems: String l
class PlayerMenu: Hashable {
let title: String
let numberOfItems: String
let menuItemViewController: UIViewController.Type?
init(title: String, numberOfItems: String, viewController: UIViewController.Type? = nil) {
self.title = title
self.numberOfItems = numberOfItems
self.menuItemViewController = viewController
}
func hash(into hasher: inout Hasher) {
hasher.combine(identifier)
}
static func == (lhs: PlayerMenu, rhs: PlayerMenu) -> Bool {
return lhs.identifier == rhs.identifier
}
private let identifier = UUID()
}
查看控制器A代码
private lazy var menuItems: [PlayerMenu] = {
return [
PlayerMenu(title: "Status", numberOfItems: "Available.", viewController: nil),
PlayerMenu(title: "Pertinent Medical History", numberOfItems: "", viewController: nil),
PlayerMenu(title: "Injury / Illness", numberOfItems: "There are no injuries.", viewController: nil),
PlayerMenu(title: "Allergy", numberOfItems: "There are no allergies.", viewController: AllergyTableViewController.self),
PlayerMenu(title: "Neurocognitive", numberOfItems: "Unavailable.", viewController: nil),
PlayerMenu(title: "Medication", numberOfItems: "There are no medications.", viewController: nil),
PlayerMenu(title: "Immunization", numberOfItems: "There are no immunizations", viewController: nil),
PlayerMenu(title: "Dictations", numberOfItems: "There are no dictations.", viewController: nil),
PlayerMenu(title: "Imaging", numberOfItems: "There is no imaging.", viewController: nil),
PlayerMenu(title: "Participation", numberOfItems: "Unavailable.", viewController: nil),
PlayerMenu(title: "Away Game Injury", numberOfItems: "Unavailable.", viewController: nil),
]
}()
extension PlayerDashboardViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let menuItem = self.dataSource.itemIdentifier(for: indexPath) else { return }
if let viewController = menuItem.menuItemViewController {
let navController = UINavigationController(rootViewController: viewController.init())
present(navController, animated: true)
}
}
}
ViewControllerA Segue
private lazy var menuItems: [PlayerMenu] = {
return [
PlayerMenu(title: "Status", numberOfItems: "Available.", viewController: nil),
PlayerMenu(title: "Pertinent Medical History", numberOfItems: "", viewController: nil),
PlayerMenu(title: "Injury / Illness", numberOfItems: "There are no injuries.", viewController: nil),
PlayerMenu(title: "Allergy", numberOfItems: "There are no allergies.", viewController: AllergyTableViewController.self),
PlayerMenu(title: "Neurocognitive", numberOfItems: "Unavailable.", viewController: nil),
PlayerMenu(title: "Medication", numberOfItems: "There are no medications.", viewController: nil),
PlayerMenu(title: "Immunization", numberOfItems: "There are no immunizations", viewController: nil),
PlayerMenu(title: "Dictations", numberOfItems: "There are no dictations.", viewController: nil),
PlayerMenu(title: "Imaging", numberOfItems: "There is no imaging.", viewController: nil),
PlayerMenu(title: "Participation", numberOfItems: "Unavailable.", viewController: nil),
PlayerMenu(title: "Away Game Injury", numberOfItems: "Unavailable.", viewController: nil),
]
}()
extension PlayerDashboardViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let menuItem = self.dataSource.itemIdentifier(for: indexPath) else { return }
if let viewController = menuItem.menuItemViewController {
let navController = UINavigationController(rootViewController: viewController.init())
present(navController, animated: true)
}
}
}
故事板截图
在情节提要中设计视图控制器时,您没有看到它的原因是调用
viewController.init()
不会从情节提要中实例化视图控制器。您需要拨打:
或者(仅适用于iOS 13+):
我建议不要将视图控制器类型存储在playermunu
类中,而是存储视图控制器的脚本标识符,如下所示:
class player菜单:可散列{
标题:字符串
让numberOfItems:字符串
let menuItemViewControllerStoryboardIdentifier:字符串?
init(标题:String,numberOfItems:String,viewControllerStoryboardIdentifier:String?=nil){
self.title=标题
self.numberOfItems=numberOfItems
self.menuItemViewControllerStoryboardIdentifier=viewControllerStoryboardIdentifier
}
[...]
}
然后,当您想要实例化视图控制器时,获取对情节提要的引用(如果它与当前视图控制器的情节提要相同,那么您可以只说self.storyboard
,否则直接使用创建情节提要):
扩展播放器DashboardViewController:UITableViewDelegate{
func tableView(tableView:UITableView,didSelectRowAt indexPath:indexPath){
guard let menuItem=self.dataSource.itemIdentifier(for:indexPath),
让viewControllerStoryboardIdentifier=menuItem.menuItemViewControllerStoryboardIdentifier,
让viewController=self.storyboard?.instanceeviewcontroller(标识符:viewControllerStoryboardIdentifier)else{
返回
}
让navController=UINavigationController(rootViewController:viewController)
存在(导航控制器,动画:真)
}
}
然后确保在情节提要中提供视图控制器标识符,并创建PlayerMenu
项,如下所示:
PlayerMenu(标题:“过敏”,numberOfItems:“没有过敏”,viewControllerStoryboardIdentifier:“过敏表ViewController(或您在故事板中给出的任何标识符)”)