Swift: переменной присваивается значение в неправильном порядке

#ios #swift #variables #variable-assignment

#iOS #swift #переменные #переменная-назначение

Вопрос:

Вероятно, я здесь упускаю что-то основное, но у меня есть два ViewControllers вызываемых ListController параметра (начиная с VC) и ExamplesController и вызываемая переменная, selectedCell которая объявляется в ListController , затем ее значение изменяется в ListController с помощью tableView didSelectRowAt indexPath функции на основе строки, по которой пользователь нажимает. Когда пользователь нажимает на ячейку, ExamplesController будет представлено (через segue в IB), но значение selectedCell не меняется, пока я не вернусь к ListController . Итак, порядок, в котором все выполняется сейчас, таков:

selectedCell инициализируется значением 0

пользователь нажимает на ячейку (скажем, с индексом 3)

ExamplesController отображается с заголовком 0

пользователь возвращается к ListController

selectedCell присваивается значение 3

Вот упрощенная версия кода.

 var selectedCell = 0

class ListController: UIViewController, UITableViewDelegate, UITableViewDataSource{

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        selectedCell = indexPath.row
        print("Tapped on (selectedCell)")
    }

}


class ExamplesController: UIViewController{

    @IBOutlet weak var chapterTitle: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()        
        chapterTitle.text = "(chapterTitles[selectedCell])"
    }

}
  

Есть идеи, что я делаю не так?

Комментарии:

1. Привет, Роберт, я делаю это из IB через переход: ibb.co/9T1djy0

2. Если переход к ExamplesController настроен в IB, то он запускается до того, как вызывается didSelectRowAt метод делегата, что и является причиной вашей проблемы. На самом деле было бы лучше либо создать segue, а затем просто вызвать его в методе ‘didSelectRowAt’, либо сохранить segue, определенный в IB, и использовать prepare метод на контроллере представления, который выполняется до представления второго контроллера представления.

3. Я понимаю, спасибо за разъяснение. Я попытался представить VC изнутри функции didSelectRow, и это сработало.

Ответ №1:

Вам нужно подключить переход из самого vc, а не из ячейки, и использовать внутри didSelectRowAt

 self.performSegue(withIdentifer:"SegueName",sender:indexPath.row)
  

 func prepare(for segue: UIStoryboardSegue,sender: Any?)  {  
  if segue.identider == "SegueName"  {
     let des = segue.destination as! ExampleVC
     des.selectedCell = sender as! Int
  }
}
  

Комментарии:

1. Большое спасибо. Загрузчик объяснения истины ваше решение помогло мне устранить проблему.