Как нажать на ячейку таблицы, чтобы представить контроллер представления с текстом в контроллере навигации - PullRequest
0 голосов
/ 19 апреля 2019

По сути, у меня есть контроллер представления с именем FirstViewController , этот контроллер представления содержит внутри него табличное представление с именем listTableView .

Я хотел бы нажать на одну из ячеек в табличном представлении listTableView и представить любой текст в ячейке в качестве заголовка контроллера навигации.

Контроллер навигации, который появляется при касании ячейки, называется showDetailsViewController .

Как это можно сделать?

Вот что я написал в FirstViewController

import UIKit
import AudioToolbox

class FirstViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, FeedModelProtocol  {
    var feedItems: NSArray = NSArray()
    var selectedStock : StockModel = StockModel()
    let tableView = UITableView()
    @IBOutlet weak var listTableView: UITableView!
    @IBOutlet weak var refreshButton: UIBarButtonItem!

    override func viewDidLoad() {
        super.viewDidLoad()
        //set delegates and initialize FeedModel


        self.listTableView.delegate = self
        self.listTableView.dataSource = self

        let feedModel = FeedModel()
        feedModel.delegate = self
        feedModel.downloadItems()

    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    @IBAction func reloadData(_ sender: Any) {

        print("reload pressed")
        listTableView.reloadData()
        viewDidLoad()
        _ = AudioServicesPlaySystemSound(1519)
    }



    func itemsDownloaded(items: NSArray) {

        feedItems = items
        self.listTableView.reloadData()
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // Return the number of feed items

        print("item feed loaded")
        return feedItems.count

    }

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

        // Retrieve cell
        let cellIdentifier: String = "stockCell"
        let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
        myCell.textLabel?.textAlignment = .center
        myCell.textLabel?.font = .boldSystemFont(ofSize: 18)
        // Get the stock to be shown
        let item: StockModel = feedItems[indexPath.row] as! StockModel
        // Configure our cell title made up of name and price


        let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-")


        print(titleStr)
        // Get references to labels of cell
        myCell.textLabel!.text = titleStr

        return myCell
    }

}

UPDATE:

В чем проблема с этим кодом:

Примечание: Идентификатор восстановления представления таблицы: scheduleTable

var homeworkIdentifierFromTableViewCell = ""
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        homeworkIdentifierFromTableViewCell = feedItems[indexPath.row].myCell
        self.performSegue(withIdentifier: "scheduleTable", sender: self)
        listTableView.deselectRow(at: indexPath, animated: true)

    }

ОБНОВЛЕНИЕ 2

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let item: StockModel = feedItems[indexPath.row] as! StockModel
    let titleStr = [item.customer].compactMap { $0 }.joined(separator: "-")
    print(titleStr)


}

1 Ответ

0 голосов
/ 19 апреля 2019

Вы можете использовать didSelectRowAt, чтобы заметить, какая ячейка была нажата, и сохранить текст в ячейке (homeworkArray - список ячеек из структуры. Homeworkidentifier - это значение в структуре).

var homeworkIdentifierFromTableViewCell = ""
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        homeworkIdentifierFromTableViewCell = homeworkArray[indexPath.row].homeworkIdentifier

        self.performSegue(withIdentifier: "homeworktoExpandHomework", sender: self)
        homeworkTableView.deselectRow(at: indexPath, animated: true)

    }

Затем вы можете использовать функцию подготовки к segue для передачи текста ячейки табличного представления в следующий контроллер представления. Вы делаете это, создавая переменную в другом контроллере представления (тот, которому вы собираетесь передавать данные), а затем обращаясь к нему из другого контроллера представления и изменяя его значение.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "reportBug" {
            let destinationViewController = segue.destination as! WebViewController
            destinationViewController.reason = "reportBug"

        }
        else if segue.identifier == "provideFeedback" {
            let destinationViewController = segue.destination as! WebViewController
            destinationViewController.reason = "provideFeedback"
        }
    }

Подробнее о передаче данных между контроллерами представления: Передача данных между контроллерами представления в Swift (из TableView в DetailViewController)

Надеюсь, это поможет


EDIT: Вот структура, которую я использую:

struct homeworkTableViewCellData {
    let homeworkName : String!
    let className : String!
    let dateName : String!
    let colorImage : UIImage!
    let homeworkIdentifier : String!
}

Я инициализировал мой homeworkArray с этой структурой. Когда я вызываю значение из ячейки, я выбираю его из структуры.

Установка табличного представления со структурой более организована. Это хорошее видео, которое научит вас, как его настроить (если вы хотите это сделать): https://www.youtube.com/watch?v=zAWO9rldyUE&list=LL--UalPCi7F16WzDFhMEg7w&index=20&t=921s

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...