iphone - 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因 : 'Receiver () has no segue with identifier ' pizzaSegue'

标签 iphone ios xcode user-interface swift

我是快速编程的新手,当将 TableView 单元按下到提供有关该单元详细信息的 View Controller 时,从 TableView 单元执行转场时会遇到错误。我收到的错误是:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'Receiver (<DrinkupClient.DrinkListTableViewController: 0x7fec5d431510>) 
has no segue with identifier 'pizzaSegue''

我已经尝试过以下操作: 1)尝试重命名 Storyboard并确保在项目设置和 info.plist 文件中设置主 Storyboard(键是“主 Storyboard文件基本名称”)。我目前的 Storyboard名为:“Main.storyboard”

2)尝试清理产品(产品 -> 清理)并重建,但这会产生相同的错误

3)我尝试从模拟器中删除该应用程序并再次运行

4)我已经仔细检查过,界面生成器中的segue标识符称为“pizzaSegue”,它在我的代码中是相同的。

import UIKit
import Alamofire

struct Drink {
    let id: String
    let name: String
    let description: String
    let amount: Float
    let image: UIImage

    init(data: [String: Any]) {
        self.id = data["id"] as! String
        self.name = data["name"] as! String
        //self.amount = data["amount"] as! Float
        self.amount = ((data["amount"] as? NSNumber)?.floatValue)!
        self.description = data["description"] as! String
        self.image = data["image"] as! UIImage
    }
}

class DrinkTableViewCell: UITableViewCell {
    @IBOutlet weak var cellName: UILabel!
    @IBOutlet weak var cellAmount: UILabel!
    @IBOutlet weak var cellDescription: UILabel!
    @IBOutlet weak var cellImage: UIImageView!

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String!) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

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

}

class DrinkListTableViewController: UITableViewController {

    var drinks: [Drink] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.title = "Drink Selection"
        tableView.dataSource = self
        tableView.delegate = self
        //tableView.register(DrinkTableViewCell.self, forCellReuseIdentifier: "cell")

        tableView.register(DrinkTableViewCell.self as AnyClass, forCellReuseIdentifier: "cell")

        //tableView.register(UINib(nibName: "DrinkTableViewCell", bundle: Bundle.main), forCellReuseIdentifier: "cell")

        //tableView.estimatedRowHeight = 134
        //tableView.rowHeight = UITableView.automaticDimension

        fetchInventory { drinks in
            guard drinks != nil else { return }
            self.drinks = drinks!
            //print("Data from API call: ", self.drinks)
            //self.tableView.reloadData()
//            DispatchQueue.main.async { [weak self] in
//                self?.tableView.reloadData()
//            }
        }
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        DispatchQueue.main.async { [weak self] in
            self?.tableView.reloadData()
        }
    }


    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            performSegue(withIdentifier: "pizzaSegue", sender: self.drinks[indexPath.row] as Drink)
        //trying another method below?
        //self.navigationController?.pushViewController(UIViewController() as! PizzaViewController, animated: true)
    }



    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "pizzaSegue" {
            guard let vc = segue.destination as? PizzaViewController else { return }
            vc.pizza = sender as? Pizza
        }
    }

    private func fetchInventory(completion: @escaping ([Drink]?) -> Void) {
Alamofire.request("http://127.0.0.1:4000/inventory", method: .get)
        .validate()
        .responseJSON { response in
            guard response.result.isSuccess else { return completion(nil) }
            guard let rawInventory = response.result.value as? [[String: Any]?] else { return completion(nil) }
            let inventory = rawInventory.compactMap { pizzaDict -> Drink? in
                var data = pizzaDict!
                data["image"] = UIImage(named: pizzaDict!["image"] as! String)
                //print("Printing each item: ", Drink(data: data))
                //printing all inventory successful
                return Drink(data: data)
            }
            completion(inventory)
    }
}

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print("ROWS: ", drinks.count)
        return drinks.count
    }


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

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

        //let cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "cell")

        let cell:DrinkTableViewCell = self.tableView.dequeueReusableCell(withIdentifier: "cell") as! DrinkTableViewCell

        //cell.cellName?.text = drinks[indexPath.row].name
        //cell.cellAmount?.text = String(drinks[indexPath.row].amount)
        //cell.cellDescription?.text = drinks[indexPath.row].description
        //cell.cellImage?.image = drinks[indexPath.row].image

        cell.imageView?.image = drinks[indexPath.row].image
        cell.textLabel?.text = drinks[indexPath.row].name
        cell.detailTextLabel?.text = drinks[indexPath.row].description

        //print(cell.textLabel?.text)
        //print(cell.detailTextLabel?.text)

        print(cell.cellName?.text as Any)
        //print(cell.cellImage?.image)
        return cell
    }

     override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
     return 100.0
     }

}

Screenshot showing error in console and the segue identifier in storyboard

最佳答案

来自您的评论:

. I have a button in the tabBarController that presents the tableView and this is working fine.

let drinkController = DrinkListTableViewController() 
let drinkNavigationController = UINavigationController(rootViewController: drinkController) 
self.present(drinkNavigationController, animated: true, completion: nil)

不,它工作不正常。这就是问题所在。

基本上,这与我在这里的回答中的情况相同:

https://stackoverflow.com/a/40077530/341994

当您说DrinkListTableViewController()时,您将获得一个无用的实例。您需要做的是与 Storyboard对话并要求实例化所需的 View Controller (通过标识符),以便您从 Storyboard获取实例,即有segue。

关于iphone - 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因 : 'Receiver () has no segue with identifier ' pizzaSegue',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55623416/

相关文章:

iphone - iOS 无法隐藏工具栏 UIbarButtonItem

iphone - 在后台运行一个进程,而用户仍然可以使用 UI

ios - 警告 : Attempt to present UIAlertController on UISplitViewController whose view is not in the window hierarchy

ios - 在文本字段中复制/粘贴光标语言

objective-c - 如何在 XCode 4.6 中获取异常详细信息?

ios - 简单的 Swift Stepper 错误

iphone - Expedia 应用程序部分索引 : how they do that?

ios - 启用拉伸(stretch)布局选项以支持更大的 iPhone

iphone - 使用 Objective C 在字符串中设置换行符和段落

ios - NSPredicate和SUBQUERY不起作用