我目前在同一个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数据库中存储数据的地方..如何修改它以使其有效?
希望你们明白我要去哪里,否则请告诉我,我会更好地解释一下: - )
答案 0 :(得分:5)
如果您希望所有人都在一个部分,这就是解决方案。
首先,在**.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
这将显示所有cellTasks后面的所有单元格。
如果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
}
}
请查看我最近关于此主题的教程,该教程将通过详细信息和示例回答您的问题: