带有UITableView部分的Swift View Controller

时间:2016-11-03 22:50:50

标签: ios swift uitableview

我一直在寻找没有运气的一段时间。我试图找到一个带有UITableView的View Controller的例子。我看到的例子都是处理一个我无法使用的表视图控制器,因为我需要在同一个视图中控制表视图内容的按钮。任何人都有一个例子,知道一个例子或有想法实现这样的?感谢。

修改

我在视图控制器中有一个表视图,从api调用中获取数据,将结构数组中的节和数据分开。然后我发送它绑定到表视图。这样做会抛出

[UIView tableView:numberOfRowsInSection:]:无法识别的选择器发送到实例

但我不明白问题所在。

tablview的代码

//MARK: Tableview delegates
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    if let count = incidentDataSection?.count{
        return count
    }
    return 0
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if (incidentDataSection?.count)! > 0{
        return incidentDataSection![section].incidents.count
    }
    return 0
}

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return incidentDataSection?[section].title
}
/*
func tableView(tableView: UITableView, iconForHeaderInSection section: Int) -> UIImage? {
    return incidentDataSection?[section].icon
}*/

//if clicked, will openn details view passing in the details
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    //let incidentDetails = incidentData?[indexPath.row]

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let section = incidentDataSection?[indexPath.section] {
        let cell = tableView.dequeueReusableCell(withIdentifier: "IncidentTableViewCell") as! IncidentTableViewCell
        cell.roadNameLabel.text = section.incidents[indexPath.row].RoadWay
        cell.whenLabel.text = section.incidents[indexPath.row].DateCreated
        cell.statusLabel.text = section.incidents[indexPath.row].DateCleared
        return cell
    }
    return UITableViewCell()
}

incidentDataSection是一个结构数组,其中包含节标题和不同的项目。

答案

虽然我收到了一些相当不错的反馈,但原因实际上是一个错字。仔细观察

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return incidentDataSection?[section].title
}

你会注意到问题是tableView:之前没有下划线。发生的事情是数据源和委托正在跳过函数,因为在swift 3中有和没有调用不同的协议。感谢这个link我能够找出原因。忘记提及这个问题的好处是在Swift 3中。可能已经为所有人节省了一些时间。

2 个答案:

答案 0 :(得分:0)

您需要在视图控制器中使用tableview实例。 在视图控制器中将协议UITableViewDelegate,UITableViewDataSource实现为UITableViewController。

不要忘记将XIB中的tableview与类中的tableview绑定。

看看这个样本:

class Sample01ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    var tableView: UITableView?

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView?.delegate = self
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)

        self.tableView?.reloadData()
    }

    // ...

答案 1 :(得分:0)

您已实现所需的方法,但听起来您需要“子类化”或“订阅”UITableView的delegatedataSource。使用:

class MyViewController : UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet var tableView : UITableView!
}

现在您已经拥有了这些协议,您需要将tableView的委托和dataSource设置为viewController。您可以通过拖放操作使用storyboard,或者在viewDidLoad()内部执行此操作,这是我一直在做的事情,因为其他开发人员很容易从打开代码和数据源所在的代码开始看到。使用:

@override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self
}

然后将为该tableView调用viewcontroller中的委托方法和dataSource方法。然后,您可以将IBOutlets添加到UIButton / UILabel / UISwitch等...并使用ViewController执行您的操作,而不仅限于使用该视图控制器内部的表视图。我在使用UITableViews / UICollectionViews时几乎总是使用这些方法,即使我将tableView / collectionView设置为整个视图的大小,因为我喜欢在UITableViewController / UICollectionViewController上使用UIViewController的自由。

*注意numberOfRows()不是必需的,但我也总是覆盖它,这只是一种习惯。另外你对iOS开发也很陌生,所以如果你还没有,那么在你的tableView启动和运行之后,接下来我要研究的是在后台线程上从你的API中提取数据,以保持你的mainThread打开以便用户响应您的用户界面DispatchQueue。如果您要从API显示图像,这非常重要。