Как сбросить содержимое ячейки табличного представления из другого viewcontroller - PullRequest
0 голосов
/ 07 июня 2018

Я, должно быть, упускаю что-то простое здесь.У меня есть приложение с несколькими контроллерами представления, и я пытаюсь сбросить строки таблицы (в частности, cell.detailTextLabel?.text), когда пользователь переходит обратно в другой контроллер представления

SummaryViewController

import UIKit

class SummaryViewController: UIViewController, UITableViewDelegate, 
UITableViewDataSource {

override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    if isMovingFromParentViewController{
        allRecipeData.removeAll()
    }
}

let summaryStatementArr = ["Cell One", "Cell Two", "Cell Three", "Cell Four"]


var allRecipeData = [recipeSettings.recipeTimeSet, recipeSettings.selectedStirTimeArr.joined(separator: ", "), recipeSettings.recipeTimeSet, recipeSettings.recipeTimeSet]


func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 4
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "cell4", for: indexPath)

    cell.textLabel?.text = summaryStatementArr[indexPath.row] 
    cell.detailTextLabel?.text = allRecipeData[indexPath.row] // I want to reset this from firstviewController 
    return(cell)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

}

Элементы в allRecipeData объявлены в глобальной переменной с использованием struct recipeSettings{}

У меня есть другой контроллер представления, который связан с вышеупомянутым, называемым firstviewController

firstviewController

import UIKit

class firstViewController: UIViewController, UITableViewDelegate, 
UITableViewDataSource {

override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    // Code here to reset tableview cells in SummaryViewController
}


func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: 
IndexPath) {
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) 
-> Int {
    return 7
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) 
-> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "cell3", for: 
indexPath)

cell.textLabel?.text = "Data"
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

}

Как мне сбросить / перезагрузить / очистить содержимое таблицы SummaryViewController из firstviewController.Я надеюсь, что это ясно.

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Я бы посоветовал вам прояснить ситуацию перед тем, как покинуть A -> B

. В вашем примере вы жестко закодировали свои данные, где, как и в надлежащем случае, вы должны хранить свои данные для ячейки в массиве.,Этот массив должен быть в состоянии установить снаружи ваших делегатов.

Предположим, у вас есть массив с именем dataArray с 7 элементами.

import UIKit

class SummaryViewController: UIViewController, UITableViewDelegate, 
UITableViewDataSource {

var dataArray = ["data1","data2","data3","data4","data5","data6","data7"]
override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    // Code here to reset tableview cells in SummaryViewController
}


func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: 
IndexPath) {}

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) 
-> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "cell3", for: 
indexPath)

    cell.textLabel?.text = dataArray[indexPath.row]
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

}

Теперь, когда вы переходите к следующему контроллеру представления, вам нужно:

dataArray = []
tableView.reloadData()

Если вы хотите сделать это из следующего класса, вы можете сохранить ссылку из SummaryViewController и сделатьтак же.Не забывайте должным образом хранить ваши контроллеры представления в памяти.

0 голосов
/ 08 июня 2018

Если вы хотите перезагрузить ваш tableView в одном контроллере от другого контроллера, вы должны использовать делегат и механизм протокола.

создайте протокол

  protocol TableReloader {
     func reloadTable() 
  }

, затем подтвердите ваш первый контроллер, который содержитtableView:

  class ViewController1: TableReloader {
      func reloadTable() {
        self.tableView.reloadData() //instead of tableView use your table outlet's name
      }
  }

Во secondViewController, из которого вы хотите перезагрузить эту таблицу, возьмите делегата:

  class ViewController2 {
      weak var delegate: TableReloader?
  }

при переходе от ViewController1 к ViewController2 вам нужно присвоить значение делегату из ViewController1 как:

  let vc2 = self.storyboard?.instantiateViewController(withIdentifier: "ViewController2") as! ViewController2

  vc2.delegate = self // this is what I was saying to do.
  // now push or present

теперь в ViewController2 всякий раз, когда вы хотите перезагрузить tableView ViewController1, просто используйте:

  delegate?.reloadTable()

Это все, надеюсь, это поможет вам

0 голосов
/ 07 июня 2018

Вы можете перезагрузить содержимое tableView, когда появится представление.

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...