Не получать данные в подробном просмотре
У меня есть TableView, который, когда пользователь щелкает по нему, должен отображать подробный вид с отображением названия строки, по которой он щелкнул. Я заполняю tableView с помощью вызова Json, но не могу понять, что я делаю неправильно.
Это мои кусочки кода ViewController
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var valueToPass:String!
@IBOutlet weak var tableView: UITableView!
// Instantiate animals class
var items = [animalObject]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
addDummyData()
}
func addDummyData() {
RestManager.sharedInstance.getRandomUser(onCompletion: {(json) in
if let results = json.array {
for entry in results {
self.items.append(animalObject(json: entry))
}
DispatchQueue.main.sync{
self.tableView.reloadData()
}
}
})
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier") as! CustomTableViewCell!
let animal = self.items[indexPath.row]
cell?.label.text = animal.name
return cell! //4.
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("You selected cell #\(indexPath.row)!")
// Get Cell Label
// let indexPath = tableView.indexPathForSelectedRow!
var currentCell = tableView.cellForRow(at: indexPath)! as UITableViewCell
print(currentCell.textLabel?.text)
valueToPass = currentCell.textLabel?.text
print(valueToPass)
performSegue(withIdentifier: "detailView", sender: indexPath)
}
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
if (segue.identifier == "detailView") {
// initialize new view controller and cast it as your view controller
let viewController = segue.destination as! DetailViewController
// your new view controller should have property that will store passed value
viewController.passedValue = valueToPass
}
}
}
и мой detailView имеет только следующую информацию
@IBOutlet weak var tooPass: UILabel!
var passedValue: String!
override func viewDidLoad() {
super.viewDidLoad()
print("DETAILS")
print(passedValue)
tooPass.text = passedValue
}
Я не уверен, что подготовленный ToSegue запускается немного раньше, потому что мой терминал выглядит так:
Я использовал в качестве ссылки следующий вопрос, любое руководство будет оценено
3 ответа
Попробуйте это для didSelectRowAt
метод.
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
valueToPass = self.items[indexPath.row]
print(valueToPass)
performSegue(withIdentifier: "detailView", sender: indexPath)
}
Просто передайте весь элемент в массиве items.
Сделайте переданный элемент DetailViewController типа item. Тогда просто доступ item.whateverPropertyRequired
,
Проблема в том, что в вашем cellForRow
метод, вы бросаете свою клетку CustomTableViewCell
типа в то время как в вашем didSelectRow
Вы применяете это как UITableViewCell
, + Изменить
var currentCell = tableView.cellForRow(at: indexPath)! as UITableViewCell
в вашем didSelectRow
в
var currentCell = tableView.cellForRow(at: indexPath)! as CustomTableViewCell
Хороший подход здесь заключается в использовании модели представления. Создайте модель, которая содержит ваши элементы и данные, связанные с ними. И в Segue передать вашу модель данных. Это плохое кодирование, получение данных прямо из ячейки с помощью метода didSelect, если какой-либо пользовательский интерфейс не работает с этой ячейкой