【问题标题】:swift table view cells does not let me use indexPath.row快速表格视图单元格不允许我使用 indexPath.row
【发布时间】:2018-05-11 08:09:42
【问题描述】:

我正在尝试将数据填充到表格视图内的单元格中。我创建了一个 selectedPlanData var,它被初始化为一个对象,其中包含数据。该对象具有诸如“名称”和“事件位置”之类的属性。在“cellForRowAt”内部时会出现问题。它不允许我将 [indexPath.row] 添加到我正在创建的单元格中,这反过来又不会正确填充单元格。

例如 - 我从第一个 cell.nameLbl.text 调用中删除了 indexPath.row - 反过来,表格视图中的每个名称标签都是相同的。这是一段代码

 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

类选择计划{

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”课程。
  • 您需要将您选择的PlanData.nameOfEvent[indexPath.row] 从字符转换为字符串
  • @Khushbu 刚刚用它更新了问题。谢谢
  • @ReinierMelian 它不会让我这样做.. 你到底是怎么建议我这样做的?
  • nameOfEvent 是 String 而chosenPlanData.nameOfEvent[indexPath.row] 你把它当成数组,它是如何工作的?

标签: ios swift tableview


【解决方案1】:

您的 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] 中的字符串这是一个角色哈哈,比我最好的阅读 +1
【解决方案2】:

扩展我的评论

  1. var chosenPlanData = ChosenPlan()

chosenPlanDataChosenPlan 的对象

  1. 现在在cellForRow 你写chosenPlanData.nameOfEvent[indexPath.row]nameOfEvent 是字符串,根据你提到的ChosenPlan

欲了解更多信息,

chosenPlanData.nameOfEvent[indexPath.row] 这一行代表您使用nameOfEventn th (indexPath.row) 对象,它是chosenPlanData 的对象

希望现在会更加清晰。

解决方案

  1. var chosenPlanData = [ChosenPlan]()

  2. cellForRow chosenPlanData[indexPath.row].nameOfEvent 中,这意味着您正在使用chosenPlanDatanth 个对象的nameOfEvent

【讨论】:

  • 你是对的 现在唯一的问题是尝试确保部分中的行数加起来。当我这样做时,我得到了一个超出范围的索引问题。但现在正在努力。谢谢
【解决方案3】:

类型处理在 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])

【讨论】:

    【解决方案4】:

    如果

    var chosenPlanData = [ChosenPlan]()
    

    试试这个:-

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

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

    【讨论】:

    • 它给了我一个错误 - '下标' 不可用:不能用 Int 为字符串下标,请参阅文档评论进行讨论
    • chosenPlanData[indexPath.row].nameOfEvent 原因 nameOfEvent 不是数组类型
    • 当我以这种方式输入时,它说 - 类型“ChosenPlan”没有下标成员
    • 你的 selectedPlanData 应该像这样 var selectedPlanData = [ChosenPlan]() 然后只有你可以在 selectedPlanData 上使用 indexpath
    • 确实如此,但是当我这样输入时,每次添加新单元格时名称都会更改。因此,如果起初表格视图有一个带有标签“狗”的单元格,我添加了另一个带有标签“猫”的单元格。我最终有 2 个单元格,但他们都说“猫”.. 它基本上得到了以前的名称标签