在同一个uitableview中显示两个不同的自定义单元格 - swift firebase

时间:2016-09-19 11:12:18

标签: ios swift uitableview firebase

我目前在同一个uitableview上显示两种不同类型的自定义单元格时遇到问题。

到目前为止我所管理的是接收更新单元的“更新”,称为cell。我只是想不通如何让numberOfRowsInSection返回两个值,所以我的两个单元格都会显示出来。

让我通过我的代码解释:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return updates.count
        return updatesTask.count // I CANNOT DO THIS - what can I do instead?
    }



    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell:updateTableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! updateTableViewCell
        let cellTask:tasksTableViewCell = tableView.dequeueReusableCellWithIdentifier("TaskCell", forIndexPath: indexPath) as! tasksTableViewCell


        let update = updates[indexPath.row]
        let updateTask = updatesTask[indexPath.row]


        // Example of the two different cells that need different data from firebase
        cell.nameLabel.text = update.addedByUser
        cellTask.nameLabel.text = updateTask.addedByUser

正如您可能看到的那样,let updateTask正在尝试获取indexPath.row,但这是不可能的,因为我在numberOfRowsInSection中不能有两个返回值,这是一个问题因为这个数字是指我的firebase数据库中存储数据的地方..如何修改它以使其有效?

希望你们明白我要去哪里,否则请告诉我,我会更好地解释一下: - )

6 个答案:

答案 0 :(得分:5)

如果你想把它们分成两部分,那么@ Callam的答案很棒。

如果您希望所有人都在一个部分,这就是解决方案。

首先,在**.k-grid tbody .k-grid .k-grid-header { height: 0;border-bottom-width: 0; overflow: hidden; display: none;}** 方法中,您需要返回这两个数组计数的总和,如下所示:numberOfRowsInSection

然后你需要像这样配置return (updates.count + updatesTask.count)方法:

cellForRowAtIndexPath

这将显示所有cellTask​​s后面的所有单元格。

如果override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { if indexPath.row < updates.count{ // Updates let cell:updateTableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! updateTableViewCell let update = updates[indexPath.row] cell.nameLabel.text = update.addedByUser return cell } else { // UpdatesTask let cellTask:tasksTableViewCell = tableView.dequeueReusableCellWithIdentifier("TaskCell", forIndexPath: indexPath) as! tasksTableViewCell let updateTask = updatesTask[indexPath.row-updates.count] cellTask.nameLabel.text = updateTask.addedByUser return cellTask } } 数组和updates数组具有相同数量的项目,并且您希望逐个显示它们,则可以使用此项:

updatesTask

答案 1 :(得分:0)

对于每一行,您必须选择是否要显示一种类型的单元格,而不是两种单元格。你应该在numberOfRowsInSection中有一个标志告诉你的方法你想要加载Cell或CellTask​​然后返回正确的行数。

答案 2 :(得分:0)

我不确定你想要达到什么目标。如果你想显示更新的单元格数量[]和updatesTask []有元素你就可以这样做

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return (updates.count + updatesTask.count)
}

然后你可以像这样修改你的cellForRowAtIndexPath方法:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell:updateTableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! updateTableViewCell
    let cellTask:tasksTableViewCell = tableView.dequeueReusableCellWithIdentifier("TaskCell", forIndexPath: indexPath) as! tasksTableViewCell

if indexPath.row < updates.count{
 //update 
 let update = updates[indexPath.row]
 cell.nameLabel.text = update.addedByUser
}else{
    let updateTask = updatesTask[indexPath.row]
    cellTask.nameLabel.text = updateTask.addedByUser 
}

    return cell
}

使用if条件,您可以选择从哪个数组中获取数据。 但要注意将数组命名为与此处的另一个常量完全相同

let updateTask = updatesTask[indexPath.row]

答案 3 :(得分:0)

您应该在total number of rows方法中返回numberOfRowsInSection。所以你可以返回你的两个数组的summation,例如,

 return updates.count + updatesTask.count

现在,在您的cellForRowAtIndexPath方法中,您可以区分您的单元格,

    let cell:updateTableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! updateTableViewCell
    let cellTask:tasksTableViewCell = tableView.dequeueReusableCellWithIdentifier("TaskCell", forIndexPath: indexPath) as! tasksTableViewCell



    if indexPath.row % 2 == 1 {

        //your second cell - configure and return
        return cellTask
    }
    else
    {

    //your first cell - configured and return
        return cell
    }

答案 4 :(得分:0)

read_only=True

答案 5 :(得分:0)

您可以创建一个简单的视图模型,它将包含多个项目类型:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="over">
  <div class="fix"></div>
  <div class="container">
    <div class="item-a item" id="a"></div>
    <div class="item-b item" id="b"></div>
    <div class="item-c item" id="c"></div>
    <div class="item-d item" id="d"></div>
    <div class="item-e item" id="e"></div>
    <div class="item-f item" id="f"></div>
    <div class="item-g item" id="g"></div>
    <div class="item-h item" id="h"></div>
    <div class="item-i item" id="i"></div>
  </div>
  <div class="fix2"><button class="reset">Reset</button></div>
</div>

然后为每个部分创建模型项类型。例如:

enum ViewModelItemType {
   case nameAndPicture
   case about
   case email
   case friend
   case attribute
}

protocol ViewModelItem {
   var type: ViewModelItemType { get }
   var rowCount: Int { get }
   var sectionTitle: String  { get }
}

配置完所有部分项目后,可以将它们保存在ViewModel中:

class ViewModelNameAndPictureItem: ViewModelItem {
   var type: ProfileViewModelItemType {
      return .nameAndPicture
   }

   var sectionTitle: String {
      return “Main Info”
   }

   var rowCount: Int {
      return 1
   }

   var pictureUrl: String
   var userName: String

   init(pictureUrl: String, userName: String) {
      self.pictureUrl = pictureUrl
      self.userName = userName
   }
}

并添加到TableViewController:

class ProfileViewModel {
   var items = [ViewModelItem]()
}

在这种情况下,NumberOfSections,NumberOfRows和CellForRowAt方法将简洁明了:

let viewModel = ViewModel()

配置节标题也非常简洁:

override func numberOfSections(in tableView: UITableView) -> Int {
      return viewModel.items.count
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      return viewModel.items[section].rowCount
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let item = viewModel.items[indexPath.section]
    switch item.type {
          // configure celll for each type
    }
}

请查看我最近关于此主题的教程,该教程将通过详细信息和示例回答您的问题:

https://medium.com/ios-os-x-development/ios-how-to-build-a-table-view-with-multiple-cell-types-2df91a206429