UITableView добавляет строку из другого Viewcontroller

У меня есть два контроллера представления, один с 3 табличными представлениями и другой контроллер. У меня есть поле uitext и текст, введенный в текстовое поле. Я хочу добавить его в одно из табличных представлений под названием ScheduleTableView в другом контроллере представления. Вот мой код, но при развертывании необязательного значения в vc.ScheduleTableView.beginUpdates() я получаю сообщение об ошибке.

@IBAction func addButtonTapped(_ sender: YTRoundedButton) {
   self.performSegue(withIdentifier: "secondvc", sender: self)

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier  == "secondvc" {
        print(TitleTextField.text!)

        let vc = segue.destination as! GrowthMainViewController

        vc.ScheduleArray.append(TitleTextField.text!)
        let indexPath = IndexPath(row: vc.ScheduleArray.count - 1, section: 0)
        vc.ScheduleTableView.beginUpdates()
        vc.ScheduleTableView.insertRows(at: [indexPath], with: .automatic)
        vc.ScheduleTableView.reloadData()
        vc.ScheduleTableView.endUpdates()



        TitleTextField.text = ""
        view.endEditing(true)

  }     
}

Я пробовал также вызывать функцию только при нажатии кнопки и обновлять табличное представление в другом представлении, но не сработало.

CoderJ13 29.05.2018 17:37

Проверьте обновленный код, но все равно у меня та же ошибка

CoderJ13 29.05.2018 17:45

Не имеет отношения к вашей проблеме, но обратите внимание, что имена переменных и функций должны начинаться с строчных букв. Имена классов начинаются с заглавных букв.

rmaddy 29.05.2018 17:48

Я хочу, чтобы контроллер представления обновлялся при нажатии кнопки в первом представлении, поэтому, где я должен поместить код во втором представлении без использования vc.AddSchedule()

CoderJ13 29.05.2018 17:49

Как вы сказали мне, я передал данные, используя let vc = segue.destination as! GrowthMainViewController vc.ScheduleTitle = TitleTextField.text!, в другое представление, но в другом представлении, как я могу обновить представление, зная, что кнопка нажата в первом представлении

CoderJ13 29.05.2018 17:52

Вы пробовали добавить текстовое значение в массив при подготовке к переходу вместо viewdidload?

Casey West 29.05.2018 19:30

@CaseyWest да пробовал, может проблема в том, что массив не сохраняется

CoderJ13 29.05.2018 19:34

@ CoderJ13 - это scheduleArray статическая переменная? Если нет, сделайте это и попробуйте добавить значение в массив в prepareforsegue.

Casey West 29.05.2018 19:42

@CaseyWest проверьте мой вопрос об обновлении

CoderJ13 29.05.2018 19:59

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

Casey West 29.05.2018 20:07

@CaseyWest сделал это глобальной такой же ошибкой, ошибка не с массивом, ошибка с vc.ScheduleTableView.beginUpdates()

CoderJ13 29.05.2018 20:15

@ CoderJ13 Мне кажется, ты слишком много над этим думаешь. Я только что создал простейшую версию этого. Все, что я делал, это добавлял данные в массив при нажатии кнопки. Затем я использую array.count в методе numRowsInSection. Это оно. Если вы хотите прислать мне свой проект по электронной почте, я могу посмотреть. Вы используете CoreData или NSUserdefaults и т. д. Для хранения пользовательских данных?

Casey West 29.05.2018 20:29

@CaseyWest да, конечно, есть проект upload.cat/13ef9c04bd6b94e4, и я могу отправить вам проект по электронной почте

CoderJ13 29.05.2018 20:53

Готово @CaseyWest

CoderJ13 29.05.2018 21:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
14
367
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

vc.ScheduleArray.count - 1, вероятно, отрицательный indexpath

попробуй это

if (vc.ScheduleArray.count - 1 >= 0){
    vc.ScheduleTableView.insertRows(at: [indexPath], with: .automatic)
}

Это не отрицательный индексный путь, поскольку у меня есть 4 элемента в моем массиве, и я попробовал +1, все еще с той же ошибкой.

CoderJ13 29.05.2018 20:03

попробовал, та же ошибка обнаружила ноль при разворачивании необязательного значения в vc.ScheduleTableView.beginUpdates()

CoderJ13 29.05.2018 20:07

вы должны добавить точку останова на vc.ScheduleTableView.beginUpdates(), распечатать TitleTextField.text! и vc. Что-то нулевое и вызывает сбой. Вам также следует по возможности избегать использования оператора bang и разворачивать их, значения nil - самый простой способ вызвать сбой приложения.

Josh O'Connor 29.05.2018 20:55

это противоречило бы цели обучения отладке, не так ли? Google, как добавить точки останова и распечатать переменные в консоли. это сделает вашу жизнь в сто раз легче

Josh O'Connor 29.05.2018 20:58

Я помогу тебе сегодня вечером, если ты не понял этого

Josh O'Connor 29.05.2018 20:58

Я сделал, распечатал TitleTextField.text! и vc.array они не ноль. Проблема с vc.ScheduleTableView.beginUpdates(), возможно, он нулевой, потому что он все еще не загружается ...

CoderJ13 29.05.2018 21:05

если вы удалите beginUpdates, insertRows и endUpdates, произойдет сбой, а если нет, отобразит ли tableview ваши изменения?

Josh O'Connor 29.05.2018 22:42

Проблема в том, что вы пытаетесь обновить контроллер представления внутри функции подготовки. Внутри этой функции создается представление, но его розетки еще не подключены.

Чтобы решить эту проблему, выполните следующие действия:

В этом методе вы должны сначала обновить свою модель:

@IBAction func addButtonTapped(_ sender: YTRoundedButton) {
   // update your model here

   self.performSegue(withIdentifier: "secondvc", sender: self)    
}

В вашем целевом контроллере представления вы должны обработать это изменение модели и перезагрузить данные табличного представления.

override func viewDidLoad() {
    self.tableView.reloadData()
}
Ответ принят как подходящий

Разрешение для этого менялось в том месте, где был объявлен массив (синглтон подходит для этого), и удалялись ненужные вставки, обновления, перезагрузки и т. д.

Затем метод numRowsInSection вызывает scheduleArray.count для отображения всех соответствующих данных.

Перед:

@IBAction func addButtonTapped(_ sender: YTRoundedButton) {
   self.performSegue(withIdentifier: "secondvc", sender: self)

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier  == "secondvc" {
        print(TitleTextField.text!)

        let vc = segue.destination as! GrowthMainViewController

        vc.ScheduleArray.append(TitleTextField.text!)
        let indexPath = IndexPath(row: vc.ScheduleArray.count - 1, section: 0)
        vc.ScheduleTableView.beginUpdates()
        vc.ScheduleTableView.insertRows(at: [indexPath], with: .automatic)
        vc.ScheduleTableView.reloadData()
        vc.ScheduleTableView.endUpdates()



        TitleTextField.text = ""
        view.endEditing(true)

  }     
}

После :

@IBAction func addButtonTapped(_ sender: YTRoundedButton) {
   self.performSegue(withIdentifier: "secondvc", sender: self)

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier  == "secondvc" {

        guard let text = TitleTextField.text else { return }
        scheduleArray.append(text)
        TitleTextField.text = ""
        view.endEditing(true)

  }     
}

Другие вопросы по теме