首页 > 解决方案 > “self.pushViewController”在 Swift4 中不起作用

问题描述

我想通过在 UINavigationController 类中放置一个 UITableView 并点击其中的单元格来进行转换。

但是,无论我按多少次单元格,它都不会进行转换。

代码是最后一个,“self.pushViewController(editViewController, animated: true)”。

我假设使用navigationPush,但我想让你告诉我为什么它不起作用。

我会寻求答案。

import UIKit
import APIKit

class BookListViewController: UINavigationController {
      struct BookInfo {
          let bookImage: UIImage?
          let bookTitle: UILabel?
          let bookPrice: UILabel?
          let bookID: UILabel?
      }

      private lazy var navBar: UINavigationBar = {
          let navBar = UINavigationBar()
          navBar.frame = CGRect(x: 0, y: view.safeAreaInsets.top, width: view.frame.width, height: 44)
          navBar.barTintColor = UIColor.white
          let navItem = UINavigationItem()
          let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(bookAdd))
          navItem.rightBarButtonItem = addButton
          navItem.title = "書籍一覧"
          navBar.pushItem(navItem, animated: false)
          return navBar
      }()

      private lazy var tableView: UITableView = {
          let tableView = UITableView()
          tableView.frame = CGRect(x: 0, y: navigationBar.frame.size.height + view.safeAreaInsets.top, width: view.frame.size.width, height: view.frame.size.height - view.safeAreaInsets.bottom)
          tableView.rowHeight = 100
          tableView.delegate = self
          tableView.dataSource = self
          tableView.register(BookListCell.self, forCellReuseIdentifier: NSStringFromClass(BookListCell.self))
          return tableView
      }()

      private lazy var safeView: UIView = {
          let safeView = UIView()
          safeView.backgroundColor = UIColor.white
          safeView.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.safeAreaInsets.top)
          return safeView
      }()

      private lazy var loadButton: UIButton = {
          let button = UIButton()
          button.setTitle("読込", for: .normal)
          button.setTitleColor(UIColor.white, for: .normal)
          button.titleLabel?.font = UIFont.systemFont(ofSize: 13)
          button.backgroundColor = UIColor.blue
          button.layer.cornerRadius = 25
          button.addTarget(self, action: #selector(moreLoad(sender:)), for: .touchUpInside)
          button.translatesAutoresizingMaskIntoConstraints = false
          return button
      }()

      override func viewDidLoad() {
          super.viewDidLoad()
          view.backgroundColor = UIColor.white
      }

      override func viewWillLayoutSubviews() {
          super.viewWillLayoutSubviews()
          setupUI()
      }
}

extension BookListViewController {
      private func setupUI() {
          view.addSubview(navBar)
          view.addSubview(safeView)
          view.addSubview(tableView)
          view.addSubview(loadButton)

          loadButton.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -20.0).isActive = true
          loadButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -100.0).isActive = true
          loadButton.widthAnchor.constraint(equalToConstant: 50.0).isActive = true
          loadButton.heightAnchor.constraint(equalToConstant: 50.0).isActive = true
      }

      @objc func bookAdd() {
          let bookAddViewController = BookAddViewController()
          self.present(bookAddViewController, animated: true)
      }

      @objc func moreLoad(sender: UIButton) {
          print("moreLoad!!")
      }
}

extension BookListViewController: UITableViewDelegate, UITableViewDataSource {
      func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
          return 10
      }

      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
          if let cell: BookListCell = tableView.dequeueReusableCell(withIdentifier: NSStringFromClass(BookListCell.self), for: indexPath) as? BookListCell {
              cell.bookimage.image = UIImage(named: "hoge")
              cell.title.text = "書籍一覧"
              cell.price.text = "200.000円"
              cell.bookDay.text = "2018/12/31"
              cell.editButton.setTitle(">", for: .normal)
              return cell
          }
          let cell = UITableViewCell()
          return cell
      }

      func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
          tableView.deselectRow(at: indexPath, animated: true)
          //個別の情報を載せて遷移
          let editViewController = R.storyboard.main.edit()!
          self.pushViewController(editViewController, animated: true)
      }
}

标签: iosswiftuitableviewuinavigationcontroller

解决方案


BookListViewController您应该像这样从另一个控制器扩展UIViewController并呈现此控制器,self.present(UINavigationController(rootViewController: BookListViewController()), animated: true)然后您可以使用insidenavigationItem轻松访问。self.navigationItemBookListViewController


推荐阅读