У меня есть два контроллера представления, один с 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)
}
}
Проверьте обновленный код, но все равно у меня та же ошибка
Не имеет отношения к вашей проблеме, но обратите внимание, что имена переменных и функций должны начинаться с строчных букв. Имена классов начинаются с заглавных букв.
Я хочу, чтобы контроллер представления обновлялся при нажатии кнопки в первом представлении, поэтому, где я должен поместить код во втором представлении без использования vc.AddSchedule()
Как вы сказали мне, я передал данные, используя let vc = segue.destination as! GrowthMainViewController vc.ScheduleTitle = TitleTextField.text!, в другое представление, но в другом представлении, как я могу обновить представление, зная, что кнопка нажата в первом представлении
Вы пробовали добавить текстовое значение в массив при подготовке к переходу вместо viewdidload?
@CaseyWest да пробовал, может проблема в том, что массив не сохраняется
@ CoderJ13 - это scheduleArray статическая переменная? Если нет, сделайте это и попробуйте добавить значение в массив в prepareforsegue.
@CaseyWest проверьте мой вопрос об обновлении
@ CoderJ13 сделайте массив глобальной переменной и посмотрите, решит ли это проблему. Я бы не предлагал это как постоянное решение, но скорее как тест, чтобы убедиться, что массив очищается сам. Позже я смогу создать пример хорошего способа сделать это без использования глобальной переменной.
@CaseyWest сделал это глобальной такой же ошибкой, ошибка не с массивом, ошибка с vc.ScheduleTableView.beginUpdates()
@ CoderJ13 Мне кажется, ты слишком много над этим думаешь. Я только что создал простейшую версию этого. Все, что я делал, это добавлял данные в массив при нажатии кнопки. Затем я использую array.count в методе numRowsInSection. Это оно. Если вы хотите прислать мне свой проект по электронной почте, я могу посмотреть. Вы используете CoreData или NSUserdefaults и т. д. Для хранения пользовательских данных?
@CaseyWest да, конечно, есть проект upload.cat/13ef9c04bd6b94e4, и я могу отправить вам проект по электронной почте
Готово @CaseyWest





vc.ScheduleArray.count - 1, вероятно, отрицательный indexpath
попробуй это
if (vc.ScheduleArray.count - 1 >= 0){
vc.ScheduleTableView.insertRows(at: [indexPath], with: .automatic)
}
Это не отрицательный индексный путь, поскольку у меня есть 4 элемента в моем массиве, и я попробовал +1, все еще с той же ошибкой.
попробовал, та же ошибка обнаружила ноль при разворачивании необязательного значения в vc.ScheduleTableView.beginUpdates()
вы должны добавить точку останова на vc.ScheduleTableView.beginUpdates(), распечатать TitleTextField.text! и vc. Что-то нулевое и вызывает сбой. Вам также следует по возможности избегать использования оператора bang и разворачивать их, значения nil - самый простой способ вызвать сбой приложения.
это противоречило бы цели обучения отладке, не так ли? Google, как добавить точки останова и распечатать переменные в консоли. это сделает вашу жизнь в сто раз легче
Я помогу тебе сегодня вечером, если ты не понял этого
Я сделал, распечатал TitleTextField.text! и vc.array они не ноль. Проблема с vc.ScheduleTableView.beginUpdates(), возможно, он нулевой, потому что он все еще не загружается ...
если вы удалите beginUpdates, insertRows и endUpdates, произойдет сбой, а если нет, отобразит ли tableview ваши изменения?
Проблема в том, что вы пытаетесь обновить контроллер представления внутри функции подготовки. Внутри этой функции создается представление, но его розетки еще не подключены.
Чтобы решить эту проблему, выполните следующие действия:
В этом методе вы должны сначала обновить свою модель:
@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)
}
}
Я пробовал также вызывать функцию только при нажатии кнопки и обновлять табличное представление в другом представлении, но не сработало.