我正在尝试设置一个包含2个单元格的tableview。两个单元都有自己的类,并且它们有自己的方法来配置它们。在代码中,当我进入cellforrowatindexpath方法时,我卡住了。我只能将其中一个单元格出列并调用它的方法,这意味着不会配置其他单元格。我想配置两者。这是我(目前)在cellforrow方法中尝试的内容:
let cells = [tableView.viewWithTag(1), tableView.viewWithTag(2)]
for view in cells {
var reuseIdentifier = "cellID"
switch view?.tag {
case 1: // error occurs here
reuseIdentifier = "storyCell"
let storyCell1 = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier, forIndexPath: indexPath) as! StoryCell1
storyCell1.theCategory.text = newsItem.storyCategory
storyCell1.theTitile.text = newsItem.titleText
storyCell1.firstParagraph.text = newsItem.paragraph1
case 2: // error occurs here too
reuseIdentifier = "storyCell2"
let storyCell2 = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier, forIndexPath: indexPath) as! StoryCell2
storyCell2.configureCell(newsItem)
default:
}
在故事板中,我已经给出了这两个单元格分别为1和2的标签,因此在最开始时就是数组。我有这个方法的2个问题。
我无法使用它,因为switch语句给我一个错误:'Int'类型的表达式模式不能匹配'Int?'类型的值
即使没有上述错误,我仍然只能在方法结束时返回一个单元格。
任何有关我的方法的帮助或不同的,更好的方法来处理这一点将不胜感激。谢谢!
编辑:
因为我确定我已经添加了标签属性,所以强制解包视图!.tag属性并且错误消失了。那么,第二个问题现在仍然存在。
答案 0 :(得分:2)
我真的不知道你想做什么。
我认为你要做的是在tableView(_:cellForRowAtIndexPath:)
方法中配置和返回两个单元格。如果你真的想这样做,那你就错了。
表格视图的数据源方法提出问题。你的工作就是通过返回一个值来回答这些问题。例如,numberOfSectionsInTableView(_:)
会询问您应该有多少个部分。答案示例可能是return 1
,return 10
等。
同样,tableView(_:cellForRowAtIndexPath:)
要求
应该在索引路径指定的部分和行中显示的单元格应该是什么?
你回答UITableViewCell
回答。您无法返回两个单元格,因为它要求您提供要在 特定部分和行显示的单元格。如果你给它显示两个单元格,表格视图如何显示它们?这没有意义!表视图中的每一行只能显示一个单元格!
因此,不是给单元格添加标签,而是使用indexPath
参数来决定要创建哪个单元格。
假设您希望第一行显示标识符为“storyCell”的单元格。并且您希望第二行显示标识符为“storyCell2”的单元格。而您的表视图只有一个部分。你可以这样做:
switch indexPath.row {
case 0:
reuseIdentifier = "storyCell"
let storyCell1 = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier, forIndexPath: indexPath) as! StoryCell1
storyCell1.theCategory.text = newsItem.storyCategory
storyCell1.theTitile.text = newsItem.titleText
storyCell1.firstParagraph.text = newsItem.paragraph1
return storyCell1
case 1:
reuseIdentifier = "storyCell2"
let storyCell2 = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier, forIndexPath: indexPath) as! StoryCell2
storyCell2.configureCell(newsItem)
return storyCell2
default:
// this shouldn't be reached if you do your other data source methods correctly
return UITabeViewCell()
}
你应该删除这些废话:
let cells = [tableView.viewWithTag(1), tableView.viewWithTag(2)]
for view in cells {
var reuseIdentifier = "cellID"