如何在Swift中以编程方式创建带有节的Grouped TableView

时间:2016-09-05 21:23:04

标签: ios swift uitableview

我想知道如何以编程方式创建分组/分区的tableview。我试图创建的设计是:

enter image description here

我希望顶部有一个UIImageView,高度为160,然后是3个部分,每个部分都有不同的行数。然后我会在每一行中放置静态标签,然后用我的数据更新它们的标签。

此VC的代码如下:

import UIKit

class SelectedFilmTableViewController: UITableViewController {

var film: Film? {
    didSet {
        navigationItem.title = film?.Film_Name
    }
}

var cellId = "cellId"

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.dataSource = self
    tableView.delegate = self
    tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: cellId)

}

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

    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier(cellId, forIndexPath: indexPath) as UITableViewCell

    cell.textLabel?.text = film?.Directed_By
    cell.detailTextLabel?.text = film?.Film_Poster_Image_URL

    return cell

}

}

我尝试添加方法来说明numberOfSections等,但我在构建应用时似乎没有看到它们。我所看到的只是一个看似正常的桌面视图。我错过了一些设置吗?

因为我以编程方式导航到此VC,所以我需要在不使用故事板的情况下进行设置。

感谢所有关于如何创建我需要的外观的帮助,谢谢!

3 个答案:

答案 0 :(得分:3)

将其他视图与TableView组合时,我更喜欢制作UIViewController并使用UITableViewController作为嵌入式控制器。

我承诺an example on github检查出来

以下是您的表控制器代码应如下所示:

class MyTableController : UITableViewController {
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 3
    }

    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        if(section == 2) {
            return "Film Information"
        } else {
            return " "
        }
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if(section == 0) {
            return 1
        } else if(section == 1) {
            return 2
        } else {
            return 4
        }
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCellWithIdentifier("SomeCell", forIndexPath: indexPath) as UITableViewCell


        return cell

    }
}

答案 1 :(得分:1)

首先,你应该使用以下方法返回3节

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

然后根据传递给此方法的节号返回每个节的1,2和4(行):

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // return if section == 0 return 1 and so on...
}

最后使用indexPath传递给此方法,根据indexPath中存储的section和row返回相应的内容:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier(cellId, forIndexPath: indexPath) as UITableViewCell

  // if indexPath.section == 0 {
  //  cell.textLabel?.text = film?.Directed_By
  //  cell.detailTextLabel?.text = film?.Film_Poster_Image_URL
  // } else if ....


    return cell

}

答案 2 :(得分:0)

您忘了拨打reloadData。将viewDidLoad方法更新为

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.dataSource = self
    tableView.delegate = self
    tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: cellId)
    tableView.reloadData()
}

如果您需要3个行数不同的部分,请将方法更改为

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

    return 3
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return [1,2,4][section]
}

要将图像添加到顶部,请使用UITableView的属性tableHeaderView