首页 > 解决方案 > 如何从选定的表格视图单元格中检索文本?

问题描述

我想从 tableview 的选定单元格中检索文本以修改其他视图控制器中的标签。我的第一个问题是我没有成功检索值并在放置它之后

这是我的表格视图文件:

class SelectionMarqueViewController: UITableViewController {

    var posts = [Post]()
    var indexMarques = 0
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self
        loadMarques()
    }

    func loadMarques() {
        var ref : DatabaseReference?
        ref = Database.database(url: "https://myride-test.firebaseio.com/").reference()
        ref?.observe(.childAdded, with: { (snapshot) in
            if let dict = snapshot.value as? [String: Any] {
                let marqueText = dict["Marque"] as! String
                let post = Post(marqueText: marqueText)
                self.posts.append(post)
                //print(self.posts)
                self.tableView.reloadData()
            }
            if let dict = snapshot.value as? [String: Any] {
                let marqueText = dict["Marque"] as! String
                let post = Post(marqueText: marqueText)
                self.posts.append(post)
                self.posts = Array(Set(self.posts))
                self.tableView.reloadData()
            }
        })      
    }

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

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath)
        let orderPosts = self.posts.sorted { $0.marque < $1.marque}
        cell.textLabel?.text = orderPosts[indexPath.row].marque
        return cell
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        indexMarques = indexPath.row
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        var selectionMarque = segue.destination as! ChoiceGeneralTableViewController
    }      
}

我的帖子文件:

class Post : Hashable {
    var marque: String

    init(marqueText: String) {
        marque = marqueText
    }
    // Equatable for contains
    static func == (lhs:Post,rhs:Post) -> Bool {
        return lhs.marque == rhs.marque
    }
    // Hashable for Set
    var hashValue:Int {
        return marque.hashValue
    }
}

然后我的标签必须更改的视图文件:

class ChoiceGeneralTableViewController: UITableViewController {
    @IBOutlet weak var marquePressed: UILabel!
    @IBOutlet weak var labelMarque: UILabel!

    var marqueSelected = posts[indexMarques]
    override func viewDidLoad() {
        super.viewDidLoad()
        labelMarque.text = marqueSelected
    }
}

实际上我没有成功检索单元格的文本,self.posts 返回 ProjectName.Post

感谢您的研究和帮助!

标签: swifttextlabeltableviewcell

解决方案


tableView.indexPath(for:)您可以使用方法获取发件人索引路径

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let indexPath = tableView.indexPath(for: sender as UITableViewCell);

    var selectionMarque = segue.destination as! ChoiceGeneralTableViewController
    selectionMarque.selected = orderPosts[indexPath.row]
}

然后您需要更改posts[indexMarques]为,: Post!因为该类无权访问帖子数组,我们需要直接传递选定的 Post 对象。

class ChoiceGeneralTableViewController: UITableViewController {
    @IBOutlet weak var marquePressed: UILabel!
    @IBOutlet weak var labelMarque: UILabel!

    var selected: Post!
    override func viewDidLoad() {
        super.viewDidLoad()
        labelMarque.text = selected.marque
    }
}

推荐阅读