提问者:小点点

使用未声明的类型“TrailViewController”-尝试处理iOS应用程序中列表中的项目详细信息


另一个关于学习的问题。 我在Apple开发文档中发现了这个

我的目标是处理我的项目列表中的一个点击。 当我点击我需要打开编辑窗口和处理我选择的行。 我试图把这个解决方案放到我的代码中,但我不知道什么是TrailViewController(我在第一个谷歌搜索页面得到中文链接)。 所以我决定把我的代码放在那里。 I获取错误:

使用未声明得类型“TrailViewController”。

在我将以下内容添加到代码中之后,它们将出现:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
       let selectedTrail = elements[indexPath.row]

       if let viewController = storyboard?.instantiateViewController(identifier: "TrailViewController") as? TrailViewController {
           viewController.trail = selectedTrail
           navigationController?.pushViewController(viewController, animated: true)
       }
   }

来自下面文件的完整代码:import UIKit import Firebase import FirebaseFirestore

class MainViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var listOfItemsTableView: UITableView!

    var elements: [Element] = []
    override func viewDidLoad() {
        super.viewDidLoad()

        let db = Firestore.firestore()

        db.collection("recipes").whereField("uid", isEqualTo: Auth.auth().currentUser!.uid).addSnapshotListener({ (snapshot, error) in
            if let snapshot = snapshot {
                var elementsTemp = [Element]()
                for doc in snapshot.documents {
                    if let itemName = doc.get("name") as? String {
                        elementsTemp.append(Element(name: itemName))
                    }
                }
                self.elements = elementsTemp
                self.listOfItemsTableView.reloadData()
            } else {
                if let error = error {
                    print(error)
                }
            }
        })
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        self.listOfItemsTableView.reloadData()
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "elementCell", for: indexPath) as! ElementCell

        cell.elementNameLabel.text = elements[indexPath.row].name

        return cell
    }

   func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
       let selectedTrail = elements[indexPath.row]

       if let viewController = storyboard?.instantiateViewController(identifier: "TrailViewController") as? TrailViewController {
           viewController.trail = selectedTrail
           navigationController?.pushViewController(viewController, animated: true)
       }
   }

    @IBAction func addItemButtonClicked(_ sender: Any) {
        self.performSegue(withIdentifier: "toAddItemView", sender: self)
    }

}

class Element {
    var name = ""

    convenience init(name: String) {
        self.init()
        self.name = name
    }
}

好的,我取得了一些进展,但此刻我无法导航到EditItemViewController。 这就是我的代码现在的样子:import UIKit import Firebase import FirebaseFirestore

class MainViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var listOfItemsTableView: UITableView!

    var elements: [Element] = []
    var element: Element?

    override func viewDidLoad() {
        super.viewDidLoad()

        let db = Firestore.firestore()

        db.collection("recipes").whereField("uid", isEqualTo: Auth.auth().currentUser!.uid).addSnapshotListener({ (snapshot, error) in
            if let snapshot = snapshot {
                var elementsTemp = [Element]()
                for doc in snapshot.documents {
                    if let itemName = doc.get("name") as? String {
                        elementsTemp.append(Element(name: itemName))
                    }
                }
                self.elements = elementsTemp
                self.listOfItemsTableView.reloadData()
            } else {
                if let error = error {
                    print(error)
                }
            }
        })
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        self.listOfItemsTableView.reloadData()
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "elementCell", for: indexPath) as! ElementCell

        cell.elementNameLabel.text = elements[indexPath.row].name

        return cell
    }

   func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
       let selectedElement = elements[indexPath.row]

       if let viewController = storyboard?.instantiateViewController(identifier: "EditItemViewControllerID") as? MainViewController {
           viewController.element = selectedElement
        self.navigationController?.pushViewController(viewController, animated: true)

    }

   }

    @IBAction func addItemButtonClicked(_ sender: Any) {
        self.performSegue(withIdentifier: "toAddItemView", sender: self)
    }

}

class Element {
    var name = ""

    convenience init(name: String) {
        self.init()
        self.name = name
    }
}

以及我的故事板此刻的样子:

也许我漏掉了什么?


共1个答案

匿名用户

创建一个名为TrailViewControllerUIViewControllerUIViewController,并将其添加为情节提要中新的UIViewController的类,您将不再收到此错误:

class TrailViewController: UIViewController {
    var trail: Element?
    // ...
}

注意:另外,不要忘记为在故事板中添加的新TrailViewController添加标识符,作为“TrailViewController”,以便在调用InstantiateViewController时获得UIViewController(在DidSelectRow中的标识符:并成功执行导航。