我一直在寻找没有运气的一段时间。我试图找到一个带有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中。可能已经为所有人节省了一些时间。
答案 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的delegate和dataSource。使用:
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显示图像,这非常重要。