如何打开带有选定单元格标题的导航控制器

时间:2019-04-19 05:35:45

标签: ios swift uitableview

我希望在选择表格单元格时打开导航控制器。导航控制器必须具有所选单元格中包含的文本的标题。

我认为我与我的代码非常接近,但是似乎无法弄清楚我在做什么错。

当我从表格中的一个单元格上选择时,什么都不会打开。

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        // Retrieve cell
        let cellIdentifier: String = "stockCell"
        let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
        myCell.textLabel?.textAlignment = .center
        myCell.textLabel?.font = .boldSystemFont(ofSize: 18)
        // Get the stock to be shown
        let item: StockModel = feedItems[indexPath.row] as! StockModel
        // Configure our cell title made up of name and price


        let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-")


        print(titleStr)
        // Get references to labels of cell
        myCell.textLabel!.text = titleStr

        return myCell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        let item: StockModel = feedItems[indexPath.row] as! StockModel
        let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-")

        print(titleStr)

    }

     func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "customerDetails" {

        let destinationVC = segue.destination as UIViewController
        let cellIdentifier: String = "stockCell"
        let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
        destinationVC.navigationItem.title = myCell.textLabel!.text
        }
    }

}

新更新:

接下来的工作:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {


    let cellIdentifier: String = "stockCell"
    let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
    myCell.textLabel?.textAlignment = .center

    // Get the stock to be shown
    let item: StockModel = feedItems[indexPath.row] as! StockModel
    // Configure our cell title made up of name and price

    let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-")

    print(titleStr)
    // Get references to labels of cell
    myCell.textLabel!.text = titleStr

    let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "detailController")
    controller.title = titleStr
    navigationController?.pushViewController(controller, animated: true)

}

但是我需要视图控制器将其自身显示为“显示详细信息”故事板样式,其中detailController覆盖了FirstViewController。

你不能回去的地方。

4 个答案:

答案 0 :(得分:1)

检查segue是否已连接到main.storyboard文件中。如果是,请检查标识符是否与代码中的标识符匹配。如果这不起作用,则可能是因为您在prepareForSegue中创建了一个新单元格,并且要修复该问题,因此必须为每个单元格创建一个全局变量。如果所有方法都不起作用,请告诉我。您可以附加main.storyboard文件吗?

答案 1 :(得分:1)

在这种情况下,最好只是以编程方式推送视图控制器。一个非常简单的完整示例如下所示:

class ViewController: UIViewController {

    let titles: [String] = ["First", "Second", "Third"]

    override func viewDidLoad() {
        super.viewDidLoad()
    }

}

// MARK: - UITableViewDelegate, UITableViewDataSource

extension ViewController: UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return titles.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
        cell.textLabel?.text = titles[indexPath.row]
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let controller = UIViewController() // or UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "whateverIdentifierISetInStoryboard")
        controller.title = titles[indexPath.row]
        navigationController?.pushViewController(controller, animated: true)
    }

}

因此,使用navigationController?.pushViewController(controller, animated: true)的方法将显示一个新的视图控制器,其动画从右到左。

只需在视图控制器上直接设置标题即可,可以使用UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "whateverIdentifierISetInStoryboard")从情节提要中创建标题。

这假定此视图控制器实际上已经在导航控制器上。

如果您确实需要对segue执行此操作,则需要使用标识符手动调用segue。您还可以将标题作为sender参数发送。

self.performSegue(withIdentifier: "customerDetails", sender: titles[indexPath.row])

在您的情况下,可能类似于:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let item: StockModel = feedItems[indexPath.row] as! StockModel
    let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-")
    self.performSegue(withIdentifier: "customerDetails", sender: titleStr)
}

现在只需使用此标题:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "customerDetails" {
        let destinationVC = segue.destination as UIViewController
        destinationVC.title = sender as? String
    }
}

另一种方法是将当前标题保存在属性上,然后在准备好segue时使用它:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let item: StockModel = feedItems[indexPath.row] as! StockModel
    let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-")
    self.nextScreenTitle = titleStr
    self.performSegue(withIdentifier: "customerDetails", sender: self)
}

然后使用:

var nextScreenTitle: String?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "customerDetails" {
        let destinationVC = segue.destination as UIViewController
        destinationVC.title = nextScreenTitle
    }
}

答案 2 :(得分:1)

您应该在 deistinationVC 中使用变量,然后在 ViewDidLoad 中使用“ navigationItem.title”

firstViewController 中:

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "customerDetails" {

    let destinationVC = segue.destination as UIViewController
    let cellIdentifier: String = "stockCell"
    let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
    destinationVC.navTitle = myCell.textLabel!.text
    }
}

SecondViewController

class secondViewcontroller : UIViewController{

  var navTitle = string()

  override func viewDidLoad() {

    navigationItem.title = navTitle

   }

答案 3 :(得分:1)

在您的更新版本中执行此操作

let controller = storyboard.instantiateviewcontroller(withIdentifier: "youridentifier") as? "name of your view controller"
navigationController?.present(controller, animated: true, completion: nil)