我在将一个tableview放在一个uitableview单元格中时遇到了麻烦。现在,它甚至不显示嵌套的tableview。我将tableview的委托和数据源设置为自定义单元格,并具有所有必需的方法。我也在为我的tableviews使用故事板,并正确连接所有插座。
问题是它没有进入cellForRow函数。但是,它确实进入了numberOfRowsInSection函数,还有heightForRow函数。下面是保存嵌套UITableviewcell的自定义单元格的代码。
import UIKit
class EventSurveyCell: UITableViewCell, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var cellBox: UIView!
@IBOutlet weak var announcementLabel: UILabel!
@IBOutlet weak var descriptionLabel: UILabel!
@IBOutlet weak var dateLabel: UILabel!
@IBOutlet weak var authorLabel: UILabel!
@IBOutlet weak var numVotesLabel: UILabel!
@IBOutlet weak var tableView: UITableView!
var surveyArray: [SurveyClass] = []
override func awakeFromNib() {
super.awakeFromNib()
tableView.delegate = self
tableView.dataSource = self
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
tableView.delegate = self
tableView.dataSource = self
// Configure the view for the selected state
}
func do_table_refresh()
{
dispatch_async(dispatch_get_main_queue(), {
self.tableView.reloadData()
return
})
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
print("cellforrow")
let cell: SurveyItemCell = self.tableView.dequeueReusableCellWithIdentifier("surveyItemCell") as! SurveyItemCell!
cell.itemLabel.text = surveyArray[indexPath.row].itemName
//go through firebase to check which one user voted on
cell.voteButton.imageView!.image = UIImage(named: "circle")
let percent = surveyArray[indexPath.row].numOfVotes/surveyArray[indexPath.row].totalNumOfVotes
cell.precentLabel.text = String(percent)
return cell
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
print("heightforrow")
return 44
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("numrowsinsection")
return 3
//should be return self.surveyArray.count.
}
}
下面是一个代码片段,用于在viewcontroller中保存自定义单元格(包含嵌套的tableviews)。此代码是cellforrowatindexpath的一部分
case PostType.survey:
let cell: EventSurveyCell = self.tableView.dequeueReusableCellWithIdentifier("EventSurveyCell") as! EventSurveyCell!
//cut out other code as it is irrelevant
cell.surveyArray = eventPost.surveyClassArray
cell.do_table_refresh()
print(cell.tableView.rowHeight)
return cell
我注意到的另一个问题是,当打印cell.tableview.rowheight时,它会打印-1。这可能是它没有进入cellforrowatindexpath的原因,但我明确地在heightforrow函数中返回44。现在,它甚至不显示嵌套的tableview。
答案 0 :(得分:7)
1)不需要do_table_refresh
,您可以直接致电cell.tableView.reloadData()
。
2)覆盖systemLayoutSizeFitting:withHorizontalFittingPriority:verticalFittingPriority函数:
override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize {
tableView.reloadData()
// if the table view is the last UI element, you might need to adjust the height
let size = CGSize(width: targetSize.width,
height: tableView.frame.origin.y + tableView.contentSize.height)
return size
}
3)在视图控制器中,设置surveyArray
后,删除此行cell.do_table_refresh()
,替换为cell.setNeedsLayout()
以自动调整布局(您可能还需要调用方法更新其他UI,例如announcementLabel等,也可以在setNeedsLayout之前调用它。)
答案 1 :(得分:0)
我遇到了同样的问题,cellForRow 没有被自定义单元格内的 TableView 调用。原因是 tableview 没有设置 height 来显示其中的内容。在我为子 TableView 设置了一些高度后,cellForRow 开始调用。