[英]UITableView Delegate is not called
在我的VC中,有一个UITableView
和一个UIlabel
。 因为我已经通过代码完成了所有工作,所以Storyboard
没有任何内容。
问题 :
如果我没有重新加载UITable
则不会调用任何UITableViewDataSource and UITableViewDelegate
。
如果我像在下面的代码中那样重新加载UITable
,则不会调用cellForRow
。
我已经完成了以下代码工作。
import UIKit
protocol DataVCProtocol
{
func addNewVC(Index : Int)
}
class DataVC: UIViewController, UITableViewDataSource, UITableViewDelegate {
var delegate:DataVCProtocol?
var tblData : UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(true)
self.view.backgroundColor = UIColor.clear
self.tblData = UITableView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width - 20 , height: UIScreen.main.bounds.size.height), style: UITableViewStyle.plain)
self.tblData.delegate = self
self.tblData.dataSource = self
self.tblData.register(TblDataCell.self, forCellReuseIdentifier: "dataCell")
self.tblData.showsHorizontalScrollIndicator = false
self.tblData.showsVerticalScrollIndicator = false
self.view.addSubview(self.tblData)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK:- TableView Datasource
// MARK:-
public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat{
return 60
}
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return 10
}
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
let dataCell : TblDataCell = tableView.dequeueReusableCell(withIdentifier: "dataCell") as! TblDataCell
dataCell.lblDataText.text = String("data cell #\(indexPath.row)")
return dataCell
}
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){
delegate?.addNewVC(Index: indexPath.row)
}
}
看到正确的单元格
我将针对您的问题发布一个通用答案,我认为许多开发人员开始在iOS上工作时会遇到这些问题,老实说,我有很多次应该这样做:
因此,只要不为UITableView
或UICollectionView
调用委托方法,通常会有3个主要原因。
1.最常见的是,未设置委托,因此它为nil,在这种情况下,显然不会在委托上调用任何方法。
2. numberOfRowsInSection
返回0或numberOfSections
返回0,在这种情况下,将调用这些方法,但不会调用其他方法,这是调试问题的好方法。
3. tableView或collectionView不会作为子视图添加到主控制器,这是在开发人员更喜欢代码而不是情节提要或xibs时发生的。 在这种情况下,设置了委托(不是nil),但是没有调用委托中的方法,对此的另一个提示是,您没有看到表视图默认的分隔符。
更新(致凯文评论)
4.检查所有委托方法中返回的内容,因为某些返回值会导致其他方法被跳过
您必须分配内存给tableview。
请做下面的事情。
var tblMenu: UITableView = UITableView()
tblMenu.frame = CGRectMake(0, 50, 320, 200); tblMenu.delegate = self
tblMenu.dataSource = self
tblMenu.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
你错过了这部分
self.view.addSubview(tblMenu)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.