Ячейки представления таблицы Swift не позволяют мне использовать indexPath.row

Я пытаюсь заполнить данные в ячейки внутри табличного представления. Я создал переменную selectedPlanData, которая инициализируется объектом с данными внутри нее. У объекта есть такие свойства, как «имя» и «местоположение события». Проблема возникает, когда внутри cellForRowAt. Это не позволяет мне добавить [indexPath.row] в создаваемую ячейку, что, в свою очередь, не заполняет ячейки правильно.

Например - я удалил indexPath.row из первого вызова cell.nameLbl.text - и, в свою очередь, каждая метка имени в представлении таблицы была одинаковой. вот кусок кода

 var chosenPlanData = ChosenPlan()   

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        guard let cell = tableView.dequeueReusableCell(withIdentifier: "individualPlansCell") as? PlanitsHomeViewCell else { return UITableViewCell() }


          cell.nameLbl.text = chosenPlanData.nameOfEvent[indexPath.row] // error Cannot assign value of type 'Character' to type 'String?'

        cell.dateAndTimeLbl.text = chosenPlanData.eventStartsAt[indexPath.row] as? String // error 'subscript' is unavailable: cannot subscript String with an Int, see the documentation comment for discussion

      cell.nameLbl.text = chosenPlanData.nameOfEvent // This works - but every single cell has the same nameLbl though


        return cell

    }


   // Here is the call back where i initialize the value for chosenPlanData

        let EventbriteTVC = segue.destination as! EventbriteTableView

        EventbriteTVC.callbackChosePlan = { result in


            DispatchQueue.main.async {
                self.individualPlanitsTableView.reloadData()
            }

            self.chosenPlanData = result



        }

импортный фундамент импортировать UIKit

class ChosenPlan {

var nameOfEvent : String = ""
var eventStartsAt : String = ""
var eventLocationIs : String = ""
var eventURL : String = ""
var imageForPlan : String?


convenience init( eventName: String, eventTime: String, eventLocation: String, eventImage: String){

    self.init()

    self.nameOfEvent = eventName
    self.eventStartsAt = eventTime
    self.eventLocationIs = eventLocation
    //self.eventURL = eventLink
    self.imageForPlan = eventImage

    //eventLink: String,
}

}

Покажите, пожалуйста, свой класс "ChosenPlan".

Khushbu 11.05.2018 10:12

вам нужно преобразовать ваш selectedPlanData.nameOfEvent [indexPath.row] из символа в String, вот и все

Reinier Melian 11.05.2018 10:12

@Khushbu только что обновил вопрос. Благодарность

Coding while Loading 11.05.2018 10:13

@ReinierMelian, это не позволит мне сделать это .. как именно ты предлагаешь мне это сделать?

Coding while Loading 11.05.2018 10:14
nameOfEvent - это String, а chosenPlanData.nameOfEvent[indexPath.row] - вы рассматриваете его как массив, как это работает?
dahiya_boy 11.05.2018 10:17

@dahiya_boy, потому что это будет представлено в виде таблицы. имя события - это параметр в созданном мной объекте.

Coding while Loading 11.05.2018 10:22

@Coding whileLoading Прочтите мой ответ, вы будете более понятны,

dahiya_boy 11.05.2018 10:29

Непонятно, как вы хотите заполнить tableView? Здесь у вас есть единый ChosenPlan, который вы используете для всех ячеек! Итак, вам, вероятно, понадобится массив ChosenPlan, как описано в другом месте. Вы можете создать и заполнить этот массив.

claude31 11.05.2018 11:57
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
868
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

если

var chosenPlanData = [ChosenPlan]()

Попробуй это:-

cell.nameLbl.text = "\(chosenPlanData[indexPath.row].nameOfEvent)"

или же

cell.nameLbl.text = "\(chosenPlanData[indexPath.row].nameOfEvent ?? "")"

Это дало мне ошибку - «нижний индекс» недоступен: невозможно добавить в нижний индекс String с помощью Int, см. Комментарий к документации для обсуждения

Coding while Loading 11.05.2018 10:16

selectedPlanData [indexPath.row] .nameOfEvent Причина nameOfEvent не является типом массива

Manish Mahajan 11.05.2018 10:19

Когда я ввожу его таким образом, он говорит - Тип "ChosenPlan" не имеет элементов нижнего индекса.

Coding while Loading 11.05.2018 10:21

Ваши selectedPlanData должны быть такими: var selectedPlanData = [ChosenPlan] (), тогда только вы можете использовать indexpath для selectedPlanData

Manish Mahajan 11.05.2018 10:24

это так, однако, когда я набираю его таким образом, имя меняется каждый раз, когда добавляется новая ячейка. Итак, если сначала в представлении таблицы есть одна ячейка с меткой «Собака», а я добавляю другую ячейку с меткой «Кошка». В итоге у меня есть 2 клетки, но они оба говорят "кот" ... в основном это происходит от предыдущего названия.

Coding while Loading 11.05.2018 10:25

Вы создаете объект класса ChosePlan ... если вам нужно сохранить два значения, вам нужно создать массив объекта класса ChosenPlan, например var selectedPlanData = [ChosenPlan] () ... Таким образом, используя indexpath, вы можете получить доступ к значениям dog, cat

Manish Mahajan 11.05.2018 10:27
Ответ принят как подходящий

Ваша переменная chosenPlanData является единственным экземпляром ChosenPlan - вы не можете использовать индекс для одного экземпляра.

Это должен быть массив ChosenPlan:

var chosenPlanData =  [ChosenPlan]()

Затем вы можете индексировать этот массив:

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

          cell.nameLbl.text = chosenPlanData[indexPath.row].nameOfEvent 
          cell.dateAndTimeLbl.text = chosenPlanData[indexPath.row].eventStartsAt

Я не понял, что OP пытался, пока не узнал, что он изначально ошибался в концепции TableView, ошибка с символами и строками была связана с тем, что он обращался к строке в [indexPath.row], которая является символом lol, +1 для лучшего чтения, чем я

Reinier Melian 11.05.2018 10:29

Обработка типов очень важна в Swift. Попробуй это.

cell.nameLbl.text = String(chosenPlanData.nameOfEvent[indexPath.row])
let index = chosenPlanData.eventStartsAt.index(chosenPlanData.eventStartsAt.startIndex, offsetBy: 3)
cell.dateAndTimeLbl.text = String(chosenPlanData.eventStartsAt[index])

расширение моего комментария

  1. var chosenPlanData = ChosenPlan()

chosenPlanData является объектом ChosenPlan

  1. Теперь в cellForRow вы пишете chosenPlanData.nameOfEvent[indexPath.row], но nameOfEvent - это строка в соответствии с вашим ChosenPlan, о котором вы упомянули в вопросе.

Для получения дополнительной информации,

chosenPlanData.nameOfEvent[indexPath.row]: эта строка представляет вас с использованием объекта п-е (indexPath.row) из nameOfEvent, который является объектом chosenPlanData.

Надеюсь теперь прояснится.

Solution

  1. var chosenPlanData = [ChosenPlan]() <- создать массив

  2. В cellForRowchosenPlanData[indexPath.row].nameOfEvent это означает, что вы используете nameOfEvent из объекта nth из chosenPlanData.

Вы были правы. Теперь проблема только в том, чтобы убедиться, что количество строк в разделах увеличивается. У меня проблема с индексом вне диапазона, когда я это делаю. но сейчас работаю над этим. Спасибо

Coding while Loading 11.05.2018 10:40

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