После того, как я нажму на ячейку, передайте мне 2 просмотра, как я могу это исправить? - PullRequest
0 голосов
/ 06 июня 2019

У меня есть приложение, которое начинается с панели вкладок с 3-мя элементами, 2 из них - просто обычный контроллер представления, один из них - контроллер навигации, а после него - представление таблицы, когда я нажимаю на ячейку, которую хочу передать 2Строка с метками и переход к новому контроллеру представления для отображения меток, моя проблема в том, что после того, как я щелкаю по ячейке, она выглядит как контроллер представления с переходом 2 до того контроллера, который мне нужен, и в первый раз я нене вижу своих данных, которые я передаю, только после того, как я нажму, чтобы вернуться к контроллеру табличного представления (здесь мне нужно вернуться к нему из двух контроллеров представления), пожалуйста, помогите мне исправить мой код, я хочу передать данные иперейти к новому контроллеру представления, и когда я хочу вернуться к табличному представлению, мне нужно нажать только назад

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

// Идентификатор перехода - «Сведения»

import UIKit

class HistoryTableViewController: 
UIViewController,UITableViewDelegate,UITableViewDataSource {


@IBOutlet weak var historyTableView: UITableView!
var historyArray = [history]()
var foods = ["Milk","Honey","Salt","Bread","Banana"]

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = historyTableView.dequeueReusableCell(withIdentifier: "cell") as? HistoryCellViewController
        else {return UITableViewCell()}

    //  cell.ageLabel.text = String(format:"%f", historyArray[indexPath.row].age)
    //  cell.genderLabel.text = historyArray[indexPath.row].gender
    // cell.ageLabel.text = String(format:"%f", 23)
    cell.genderLabel.text = foods[indexPath.row]
    cell.ageLabel.text = foods[indexPath.row]
    // cell.genderLabel.text = "Bar"
    //cell.historyImage.image = nil
    return cell

}

var selectedAge:String = " "
var selectedGender:String = " "
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    selectedAge = self.foods[indexPath.row]
    selectedGender = self.foods[indexPath.row]
    performSegue(withIdentifier: "Details", sender: self)


}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "Details"{
        let vc = segue.destination as! HistoryDetailsViewController
        vc.age = selectedAge
        vc.gender = selectedGender
    }
}


func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == UITableViewCell.EditingStyle.delete {

        foods.remove(at: indexPath.row)
        historyTableView.reloadData()
    }

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

    // Do any additional setup after loading the view.
}

}

// просмотр контроллера, который я хочу передать после щелчка по ячейке

 import UIKit

 class HistoryDetailsViewController: UIViewController {
 @IBOutlet weak var ageLabel: UILabel!
 @IBOutlet weak var genderLabel: UILabel!
 var age:String?
 var gender:String?
 override func viewDidLoad() {
    super.viewDidLoad()
      ageLabel.text = self.age
      genderLabel.text = self.gender
    // Do any additional setup after loading the view.
}

 //
 //    @IBAction func Back(_ sender: UIBarButtonItem) {
 //        
//      //  self.tabBarController?.selectedIndex = 0
//    }



}

1 Ответ

0 голосов
/ 06 июня 2019

Прежде всего, в tableView(_:cellForRowAt:) вы typecasting от dequeued cell до HistoryCellViewController.

Мой вопрос - что такое type из HistoryCellViewController?Это UITableViewCell или что-то еще?В случае, если это UITableViewCell, вы должны переименовать его в нечто более важное, например HistoryCell.Это немного сбивает с толку.

Подход-1:

Теперь перейдем к актуальной проблеме, с которой вы столкнулись.Вместо использования segue, попробуйте нажать HistoryDetailsViewController вручную, например, так:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if let controller = self.storyboard?.instantiateViewController(withIdentifier: "HistoryDetailsViewController") as? HistoryDetailsViewController {
        controller.age = self.foods[indexPath.row]
        controller.gender = self.foods[indexPath.row]
        self.navigationController?.pushViewController(controller, animated: true)
    }
}

Нет необходимости в дополнительных переменных - selectedAge и selectedGender.

Approach-2:

Если вы хотите сделать это с самим segue, то не вызывайте performSegue(withIdentifier:sender:) в tableView(_:didSelectRowAt:), т.е. удалите приведенную ниже строку кода,

performSegue(withIdentifier: "Details", sender: self)

Это потому, что "Details" segue выполняется дважды - один раз с помощью storyboard, а другой - с помощью приведенной выше строки кода.

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