【问题标题】:UIBarButtonItem will not show when I segue programmatically当我以编程方式进行 segue 时,UIBarButtonItem 不会显示
【发布时间】:2020-02-18 21:13:09
【问题描述】:

我正在构建一个应用程序,我在其中以编程方式从 ViewControllerA 进行 segue,因为它是一个菜单项列表,每个菜单项都指向不同的 VC,因此我没有使用多个 segue,而是在代码中实例化视图控制器。我的问题是,即使我的故事板上有一个栏按钮项目,它也不会显示在应用程序中。

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()

   }

ViewController 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),

        ]
    }()

ViewControllerA Segue

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)
        }
    }
}

故事板屏幕截图

【问题讨论】:

    标签: ios swift xcode navigation segue


    【解决方案1】:

    您没有看到您在情节提要中设计的视图控制器的原因是调用viewController.init() 不会从情节提要中实例化您的视图控制器。您需要致电:

    UIStoryboard.instantiateViewController(withIdentifier:)

    或者(仅适用于 iOS 13+):

    UIStoryboard.instantiateViewController(identifier:creator:)

    我建议不要将视图控制器类型存储在 PlayerMenu 类中,而是存储视图控制器的情节提要标识符,如下所示:

    class PlayerMenu: Hashable {
        let title: String
        let numberOfItems: String
        let menuItemViewControllerStoryboardIdentifier: String?
    
        init(title: String, numberOfItems: String, viewControllerStoryboardIdentifier: String? = nil) {
            self.title = title
            self.numberOfItems = numberOfItems
            self.menuItemViewControllerStoryboardIdentifier = viewControllerStoryboardIdentifier
        }
    
        [...]
    }
    

    然后当你想实例化你的视图控制器时,获取你的故事板的引用(如果它与当前视图控制器的故事板相同,那么你可以直接说self.storyboard,否则直接用UIStoryboard.init(name:bundle:)创建故事板) :

    extension PlayerDashboardViewController: UITableViewDelegate {
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            guard let menuItem = self.dataSource.itemIdentifier(for: indexPath),
                let viewControllerStoryboardIdentifier = menuItem.menuItemViewControllerStoryboardIdentifier,
                let viewController = self.storyboard?.instantiateViewController(withIdentifier: viewControllerStoryboardIdentifier) else {
                    return
            }
    
            let navController = UINavigationController(rootViewController: viewController)
            present(navController, animated: true)
        }
    }
    

    然后确保在情节提要中提供视图控制器标识符,并像这样创建 PlayerMenu 项目:

    PlayerMenu(title: "Allergy", numberOfItems: "There are no allergies.", viewControllerStoryboardIdentifier: "AllergyTableViewController (or whatever identifier you give this in your storyboard)")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 2016-07-21
      • 1970-01-01
      相关资源
      最近更新 更多