Как получить текст из выбранной ячейки таблицы? - PullRequest
0 голосов
/ 06 января 2019

Я хочу получить текст из выбранной ячейки табличного представления, чтобы изменить метку в другом контроллере представления. Моя первая проблема - мне не удается получить значение и после его установки

Вот мой файл таблицы:

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
    }      
}

Файл My Post:

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

Спасибо за ваши исследования и помощь!

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Путь индекса отправителей можно получить с помощью 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
    }
}
0 голосов
/ 06 января 2019

Добавить переменную в ChoiceGeneralTableviewController:

public var postText: String?

И в вашем файле табличного представления (первом) didSelectRowAtIndexPath (...), сразу после создания экземпляра selectionMarque (другого контроллера табличного представления):

selectionMarque.postText = orderPosts[indexMarques].marque

В ChoiceGeneralTableviewController вы можете получить доступ к postText в качестве текста метки.

Редактировать: код

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()
            }
        })

        // Sort the posts
        self.posts = self.posts.sorted { $0.marque < $1.marque}
    }

    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)

        cell.textLabel?.text = self.posts[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
        selectionMarque.postText = posts[indexMarques].marque
    }
}

И контроллер вида цели:

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

    public var postText: String?

    var marqueSelected = posts[indexMarques]
    override func viewDidLoad() {
        super.viewDidLoad()
        // Make sure postText is not nil
        if let text = postText {
            labelMarque.text = text
        }
    }
}
...