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的主要内容,如果未能解决你的问题,请参考以下文章

Notification的简单使用

如何更新 Apple 地图中的路线 - iOS 13.0 中的 Xcode Swift 5?

Facebook 登录后无法推送到 PFQueryTableViewController

如何使用 JSON.serializer 在 Swift 中解析 JSON

无法分配给属性:“xxxx”是一个只能获取的属性

使用 NSTimer 时发送到实例的无法识别的选择器