2017-02-16 8 views
0

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

Мое приложение будет довольно простой формой, которую пользователь может заполнить, и он будет генерировать PDF в конце, содержащем информацию. Для основной информации у меня есть табличное представление, содержащее набор полей UIText, и у них нет проблем с итерацией через них и извлечением данных в массив строк. Для следующего раздела пользователю нужно было ввести намного больше текста, поэтому я использовал UITextviews в виде таблицы. То, что я хочу сделать, это извлечь введенный текст и сохранить его в массив строк, который используется для создания объекта клиента. Код, который делает это следующим образом:

func createGoals() { 
    for section in 0..<secondTableView.numberOfSections { 

     for row in 0..<secondTableView.numberOfRows(inSection: section) { 

      let indexPath = NSIndexPath(row: row, section: section) 
      let thisCell = secondTableView.cellForRow(at: indexPath as IndexPath) as! mySecondCell 
       if thisCell.textview.text == "Enter Goals" { 
       print("NO CONTENT IN FIELD") 
       let ac = UIAlertController(title: "But...But...", message: "If you have no goals, how can you progress?!", preferredStyle: .alert) 
       ac.addAction(UIAlertAction(title: "OK", style: .default)) 
       present(ac, animated: true) 
       break 
       } else { 
        print("I MADE IT") 
        print("\(thisCell.textview.text!)") 
        newClient.goalArray.append(thisCell.textview.text) 
        print(newClient.goalArray) 
        } 
     } 
    } 

} 

Но когда это работает, я получаю сообщение об ошибке «неожиданно нашел ноль в то время как разворачивание необязательного значения», и это особенно подчеркивает эту строку:

let thisCell = secondTableView.cellForRow(at: indexPath as IndexPath) as! mySecondCell 

Этих код почти идентичен тому, как я успешно перебираю поля UITextfield, все, что было изменено, связано с переменными, и насколько я вижу, нет никаких опций. Также, если я не заполняю UITextviews, он покажет UIAlertController, это только кажется проблемой, когда я удаляю заполнитель и заполняю UITextviews. Есть ли у кого-нибудь идеи, почему это происходит? При необходимости я могу предоставить больше своего кода.

+0

Отладчик сообщает вам, что secondTableView не содержит ни одной ячейки в строке, которую вы передали. Проверка подсчета строк secondTableView должна помочь. – ystack

+0

Я только что пробовал в отладчике, и он возвращает 4 строки в разделе 0, который как и ожидалось. Строки определенно есть, так может ли мой цикл петух каким-то образом пропустить? – EtherCode

+0

'mySecondCell' кажется экземпляром, а не классом. Вы должны получить ячейку как тип класса, то есть. 'let thisCell = secondTableView.cellForRow (at: indexPath как IndexPath) как! MyCellSubclass' или даже лучше использовать Guard 'guard, пусть thisCell = secondTableView.cellForRow (at: indexPath как IndexPath) как? mySecondCell else {return} ' –

ответ

0

Вот ваш факультативный

as! mySecondCell 

Очевидно, thisCell не mySecondCell

Проверить, если вы сделали зарегистрировать правильный класс

EDIT

Вы не должны вызывать метод делегирования самостоятельно

+0

О, я не понимал, что все еще считается факультативным, я думал, что вынужденные понижения были разными.Вот как я зарегистрировал его, я уверен, что это правильно? В VDL: 'secondTableView.delegate = само secondTableView.dataSource = само secondTableView.register (mySecondCell.self, forCellReuseIdentifier: "secondCellID")', Также в cellForRow: «, если Tableview == самостоятельно .secondTableView { let bCell = secondTableView.dequeueReusableCell (withIdentifier: "secondCellID", для: indexPath) как! mySecondCell ', Это правильный способ зарегистрироваться прямо сейчас? – EtherCode

+0

Возможно, вы правы. Я не обращал внимания на то, где вы использовали этот кусок кода. Вы должны прочитать ответ Калпеша jetani. Он прав, вы не можете назвать метод делегата самостоятельно – Acrasia

0

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

здесь вы не должны загружать ячейку со стороны cellForRowAtIndexPath.

Причина: UITableView повторно использует ячейку с reusableCellIdentifier.

здесь вам нужно сохранить значения в массиве или словаре при вызове textfield-didEndEditing (метод делегата текстового поля). и для проверки проверки вы можете использовать сохраненное значение из массива/словаря.

+0

Хорошо блестяще, я попробую это так и посмотрю. Просто из интереса есть ли какая-либо причина, по которой загрузка ячейки внутри итерации отлично работает при итерации через textFields, но не при использовании textViews? – EtherCode

+0

, если он работает с textFields, тогда он должен работать с textViews, когда он не слаб. если вы итерации tableview.visiblecells вы не получите выше вопроса. но здесь ваша задача не завершена. поэтому для получения измененных значений из textviews/Textfields вам нужно сохранить его на didEndEditing. все еще есть проблема, проверьте пожалуйста категория/extenstion Or супер класс. –