【问题标题】:Swift - Error during simple Segue between TableViewController -> ViewControllersSwift - TableViewController - > ViewControllers之间的简单Segue期间出错
【发布时间】:2018-06-16 05:00:35
【问题描述】:

我正在尝试使用 TableViewController 和 ViewController 之间的 segue 传递两个字符串值,其中包含“Bar Name”及其各自的“Street Name”的值。我正在使用一个名为HomeController 的类和另一个名为BarPage 的类。我为主屏幕准备了以下代码,这是一个包含单元格的表格视图控制器,当单击它时,应该执行我在故事板上包含的 segue。我删除了一些多余的代码来解释这个问题:

import UIKit
import Firebase

class HomeController: UIViewController, UITableViewDelegate, UITableViewDataSource{

    let barsArray = [Data(image: "bar1", street: "123 North Street"),
                    Data(image: "bar2", street: "345 South Street"),
                    Data(image: "bar3", street: "678 West Street")]

    let tableView: UITableView = {
        let tv = UITableView()
        tv.separatorStyle = .none
        tv.allowsSelection = true
        return tv
    }()

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return barsArray.count
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 100
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! BarCell

        cell.barImageView.image = UIImage(named: barsArray[indexPath.item].image!)
        cell.barCoverLabel.text = "Street: " + barsArray[indexPath.item].street!

        return cell
    }

    var locationName : String?
    var locationStreet : String?

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let barPage = segue.destination as! BarPage
        barPage.barName = locationName!
        barPage.barStreet = locationStreet!
    }

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


        locationName = self.barsArray[indexPath.row].image
        locationStreet = self.barsArray[indexPath.row].street


        // WHEN USER PRESSES A ROW, PERFORM SEGUE

        performSegue(withIdentifier: "mySegue", sender: self)

        // Then enter the second view controller

        present(BarPage(), animated: true, completion: nil)


    }



    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.backgroundColor = .black
        setUpTableView()

    }
    func setUpTableView(){
        tableView.dataSource = self
        tableView.delegate = self
        tableView.register(BarCell.self, forCellReuseIdentifier: "cell")

        view.addSubview(tableView)

        .... add anchors and constraints for table view ..........
    }

}

var home: HomeController?

class BarCell: UITableViewCell{


    ... add custom styling for each cell of the table view ....

    override init(style: UITableViewCellStyle, reuseIdentifier: String?){
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setup()
    }

    func setup(){
        .......... add anchors and constraints for the cell..........
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

这是来自 View Controller BarPage 的代码,它应该从他的 segue 中检索字符串。

import UIKit
import Firebase



class BarPage: UIViewController{

    let homeController = HomeController()

    // These, in theory, should be the variables that retrieve the strings through my segue

    var barName = String()
    var barStreet = String()

    public let barStreet: UILabel = {
        var label = UILabel()
        label.text = "The street is: "// + barStreet
        label.textColor = .black
        label.font = UIFont.boldSystemFont(ofSize: 16)
        return label
    }()
    let barImage: UIImageView = {
        let iv = UIImageView()
        iv.image = UIImage(named: barName) // Should retrieve the image based on the string that is passed
        iv.contentMode = .scaleAspectFill
        iv.backgroundColor = .yellow
        //iv.clipsToBounds = true
        return iv
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.mint()

        view.addSubview(barStreet)
        view.addSubview(barImage)

        positionElements()

    }

    func positionElements(){
        .......... add anchors and constraints for the elements..........
    }
}

如果我在不包含 segue 的情况下运行我的代码,则转换效果很好。但是,如果我包含 Segue,则会收到以下错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: 'Receiver (<ProjectName.HomeController: 0x7f9fcec0fb10>) has 
no segue with identifier 'mySegue''

如果我的故事板中确实有一个带有该标识符的 segue,这怎么可能?这是我的故事板的图片,显示了我正在使用的标识符:

正如您在右侧看到的,相同的标识符与我的故事板中的 segue 匹配,但我的错误表明它无法找到。我该如何解决这个问题?这是因为我试图从 TableViewController 执行 Segue 吗?成为 Swift 用户的第一个月,如有任何歧义,我们深表歉意。任何可以为我指明正确方向的提示/建议都会非常有帮助。

【问题讨论】:

  • 您执行segue,然后手动呈现BarPage 的(不同)实例。你不能同时使用两者。既然你一直在使用故事板,你为什么要在代码中创建表格视图?是不是特别爽?并考虑实例HomeController()不是故事板中的实例。
  • @vadian 我以编程方式创建了整个表格视图,并且没有实现故事板就没有办法执行segue。这就是为什么我在上面的图片中包含了两个视图控制器。您能否澄清一下您的意思是“实例 HomeController() 不是情节提要中的实例”?抱歉,对故事板很不熟悉。
  • 视图控制器的默认初始化器() 创建一个新的控制器空白实例,该实例与情节提要中的实例无关。如果要引用故事板中的实例,则需要通过 segue 传递引用。如果您是初学者,请寻找在故事板中设计 UI 的教程。方便多了。

标签: ios swift uitableview segue uistoryboardsegue


【解决方案1】:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)  {
                performSegue(withIdentifier: "mySegue", sender: indexPath.row)
            }

【讨论】:

  • 很好的建议,但同样的错误仍在发生@Khawar Islam
  • 你能分享一下这个项目吗?
  • 为什么不将 Storyboard 用于设计目的?
  • 我只是选择以编程方式创建整个项目,因为我一直在关注教程。有没有其他方法可以在不分享我的整个项目的情况下回答其他问题?包含一些私人资料。
  • 没问题,伙计!我是来帮你的。首先用单元格制作一个tableView。
【解决方案2】:

在你的 segue 准备中添加这样的东西:

    if let selectedIndex = tableView.indexPathForSelectedRow {
        barPage.barStreet = barsArray[selectedIndex.row].street
        ...

}

并确保您正在调用 self.performSegue...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    相关资源
    最近更新 更多