XCode:无法在 UIViewController 中嵌入 UITableview
Posted
技术标签:
【中文标题】XCode:无法在 UIViewController 中嵌入 UITableview【英文标题】:XCode: Unable to embed a UITableview in a UIViewController 【发布时间】:2015-11-03 16:00:00 【问题描述】:我想创建一个带有嵌入式 UITableView 的 UIViewController。我见过各种例子,但到目前为止还无法让它发挥作用。出口嵌入在表格单元格中。
class CREWStartMenuVCCell: UITableViewCell
@IBOutlet weak var myButton: UIButton!
@IBOutlet weak var myTextView: UITextView!
class CREWStartMenuVC: UIViewController // , UITableViewDelegate // UITableViewDataSource,
@IBOutlet weak var tableView: UITableView! //<<-- TableView Outlet
override func viewDidLoad()
super.viewDidLoad()
createAppData()
tableView.registerClass(CREWStartMenuVCCell.self, forCellReuseIdentifier: getCellName(viewName))
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> CREWStartMenuVCCell!
let cell = tableView.dequeueReusableCellWithIdentifier(getCellName(viewName), forIndexPath: indexPath) as! CREWStartMenuVCCell
//处理不相关的单元格代码
如果我尝试覆盖以下函数,我会收到此错误:方法不会覆盖其超类中的任何方法。我错过了什么?
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat // was override
// calculate length of text and adjust the size of cell for that
return calculateTipsHeight(viewName, text:getTipsInfo(viewName, sectionNumber: indexPath.section, tipOrder: indexPath.row).tipItemText)
func numberOfSectionsInTableView(tableView: UITableView) -> Int
return 1
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int section))
return getTipsRowCount (viewName, sectionNumber: 0)
更新
当我尝试添加 UITableViewDataSource 时出现以下错误:
5:17: Protocol requires function 'tableView(_:cellForRowAtIndexPath:)' with type '(UITableView, cellForRowAtIndexPath: NSIndexPath) -> UITableViewCell'
34:10: Candidate has non-matching type '(UITableView!, cellForRowAtIndexPath: NSIndexPath!) -> CREWStartMenuVCCell!'
我没有看到错误。
【问题讨论】:
使用 tableDataSource &TablleDelegate 在你的类中实现 CellForRowAtIndexPath, numberOfRowsInSections。如下类CREWStartMenuVC: UIViewController, UITableViewDelegate, UITableViewDataSource, 如果我按照您的建议更改课程(我之前尝试过),我会收到此消息:类型“CREWStartMenuVC”不符合协议“UITableViewDataSource” 【参考方案1】:由于类 CREWStartMenuVC 不继承自 UITableViewController(或任何其他实现这些方法的类),因此可以(或必须)实现协议 UITableViewDelegate 和 UITableViewDataSource 中的方法,但它们不会被覆盖。这意味着这些方法的实现之前不能有
override
另外,如果您没有在 Storyboard 中执行此操作,请不要忘记设置 tableView 的委托和数据源,例如,在 CREWStartMenuVC 类的 viewDidLoad() 调用中。
tableView.delegate = self
tableView.dataSource = self
关于UPDATE的两个错误,直接替换
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> CREWStartMenuVCCell!
与
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> CREWStartMenuVCCell!
(唯一的区别是 UITableView 和 NSIndexPath 类后面的感叹号!)
【讨论】:
我之前尝试过添加这个,但我仍然无法覆盖这些函数。 查看编辑后的答案。正如我所说,您不必使用命令覆盖 我曾尝试不使用覆盖,但没有任何区别。当我运行视图时,它会在 tableview 之前显示项目,但没有其他内容。 我不知道。我很确定的是,Method does not override any method from its superclass 这句话意味着您尝试override
一些超类未实现的方法。
显然我做到了,但如何让方法被调用?为什么我不能使用 UITableViewDataSource?【参考方案2】:
删除 tableView.registerClass 后,我让它在没有 UITableViewDataSource 的情况下工作 这是工作代码:
class CREWStartMenuVCCell: UITableViewCell
@IBOutlet weak var myButton: UIButton!
@IBOutlet weak var myTextView: UITextView!
class CREWStartMenuVC: UIViewController, UITableViewDelegate //, UITableViewDataSource //
@IBOutlet var tableView: UITableView! //<<-- TableView Outlet
override func viewDidLoad()
super.viewDidLoad()
createAppData()
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> CREWStartMenuVCCell
let cell = self.tableView.dequeueReusableCellWithIdentifier(getCellName(viewName), forIndexPath: indexPath) as! CREWStartMenuVCCell
// MARK: Common tips code
【讨论】:
以上是关于XCode:无法在 UIViewController 中嵌入 UITableview的主要内容,如果未能解决你的问题,请参考以下文章
如何更新 Apple 地图中的路线 - iOS 13.0 中的 Xcode Swift 5?
Facebook 登录后无法推送到 PFQueryTableViewController