Данные TableCell, передаваемые другому UIViewController - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть таблица, которая заполняет данные из SQL в TableCells.Когда я щелкаю ячейку, я хочу, чтобы данные только этой конкретной ячейки передавались в другой UIViewController.Данные включают в себя строки.Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Позволяет будущим поисковикам легко найти этот ответ -

Передача данных между UITableViewController в UIViewController

Метод 1 - использование раскадровки (меньше кода)

Начальная сцена-

Контроллер табличного представления (встроенный в UINavigationController) - это первый ViewController, который мы увидим, когда откроем приложение, мы хотим, чтобы он передавал данные в наш контроллер целевого представления

Контроллер целевого представления - это тот ViewController, которого мы достигнем после выбора ячейки.

В следующем GIF вы можете видеть, что я установил переход из нашего TableViewCellв Controller View Destination, идентификатор перехода будет toDestination (при перетаскивании не может видеть синюю линию ? удерживая ctrl при этом)

Setting up segue

Вот так должна выглядеть ваша сцена раскадровки -

(не забудьте установить идентификатор повторного использования вашей ячейки, чтобы вы могли использовать его позже в коде)

starting scene Теперь давайте погрузимся в код:

В нашем TableViewController мы напишем эту функцию:

// Here we're transfering the data we want to our DestinationViewController
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if let destinationVC = segue.destination as? DestinationViewController{

        if let pressedIndexPath = tableView.indexPathForSelectedRow{
            // passed string is just some variable I've declared on DestinationViewController
            destinationVC.passedString = dataHolder[pressedIndexPath.row]
        }
    }
}

Когда вы даже вызывали эту функцию? -Я не вызывал его, он вызывается автоматически, потому что я установил переход между нашей ячейкой и нашим DestinationViewController с помощью нашей раскадровки (помните начальную сцену? ...), теперь каждый раз, когда пользователь нажимает эту ячейку, запуск начинается автоматическии эта функция вызывается

Наша сторона DestinationViewController выглядит так -

class DestinationViewController: UIViewController {

      @IBOutlet weak var label: UILabel!

      var passedString: String!

       override func viewDidLoad() {
          super.viewDidLoad()

          label.text = passedString
       }
}

Мы закончили, вот окончательный результат enter image description here

Полный код:

class TableViewController: UITableViewController {

   let dataHolder = ["string1", "string2", "string3", "string4"]

   override func numberOfSections(in tableView: UITableView) -> Int { return 1 }

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


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

       // change "cell" to your cell's reuse identifier
       let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

       cell.textLabel?.text = dataHolder[indexPath.row]

       return cell
   }

   // Here we're transfering the data we want to our DestinationViewController
   override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

       if let destinationVC = segue.destination as? DestinationViewController{

           if let pressedIndexPath = tableView.indexPathForSelectedRow{

               destinationVC.passedString = dataHolder[pressedIndexPath.row]
           }
       }
    }
}

А с другой стороны:

class DestinationViewController: UIViewController {

      @IBOutlet weak var label: UILabel!

      var passedString: String!

       override func viewDidLoad() {
          super.viewDidLoad()

          label.text = passedString
       }
}
0 голосов
/ 29 ноября 2018

Вы можете создать собственную ячейку, подобную этой

class CustomCell: UITableViewCell {
    var yourData: CustomData? // You can put your data here as you want, you can also have three different variables for your data

    override func awakeFromNib() {
        // Initialization code
        super.awakeFromNib()
    }
}

После этого в функции cellForRow

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

    // Here you can set data of your cell as you want
    cell.yourData = // Put your data

    return cell
}

И затем вы можете передать свои данные, используя didSelectRowAt

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let selectedCell: CustomCell = tableView.cellForRow(at: indexPath)!
    let yourData = selectedCell.yourData
    // Here you can perform a segue or you can present a ViewController and pass your data
    ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...