Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当我以编程方式切换时,UIBarButtonim将不显示_Ios_Swift_Xcode_Navigation_Segue - Fatal编程技术网

Ios 当我以编程方式切换时,UIBarButtonim将不显示

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

我正在构建一个应用程序,其中我以编程方式从ViewControllerA中分离,因为它是一个菜单项列表,每个菜单项都指向不同的VC,所以我没有使用多个分段,而是在代码中实例化了view controller。我的问题是,即使我的故事板上有一个条形按钮项目,它也不会显示在应用程序中

查看控制器A菜单型号代码:

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(或您在故事板中给出的任何标识符)”)