将Tableview放在UITableViewCell Swift

时间:2017-01-01 20:56:47

标签: swift uitableview nested

我在将一个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。

2 个答案:

答案 0 :(得分:7)

1)不需要do_table_refresh,您可以直接致电cell.tableView.reloadData()

2)覆盖systemLayoutSizeFitting:withHorizo​​ntalFittingPriority: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 开始调用。