使用未声明的类型'TrailViewController'--试图在iOS应用中处理列表中的项目细节。

问题描述 投票:0回答:1

另一个学习的问题.我在苹果开发文档中发现了这个问题。这个

我的目标是处理我的项目列表上的一次点击。当我点击时,我需要打开编辑窗口并处理我选择的行。我试图把这个解决方案放到我的代码中,但我不知道什么是TrailViewController(我在google搜索页面上得到了中文链接)。所以我决定把我的代码放在那里。我得到的错误是:"Use of undeclared type 'TrailViewController'"。

Use of undeclared type '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
    }
}

更新1

好吧,我取得了一些进展,但此刻我无法导航到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
    }
}

而我的故事板此刻的样子。

enter image description here

也许我错过了什么?

ios swift list tap
1个回答
0
投票

做一个 UIViewController 名为 TrailViewController 并将其添加为新的 UIViewController 中,你就不会再收到这个错误。

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

注意:另外,别忘了为新的 "故事板 "添加标识符。TrailViewController 在故事板上添加为 "TrailViewController" 以获得 UIViewController 呼叫 instantiateViewController(identifier:didSelectRow 并成功进行导航。

© www.soinside.com 2019 - 2024. All rights reserved.