【问题标题】:What is the need of using Override with UITableView methods使用 UITableView 方法的 Override 需要什么
【发布时间】:2020-05-18 21:10:06
【问题描述】:

使用 UITableView 方法的 Override 需要什么以及何时使用它。每次覆盖都没有使用,但无论在哪里使用,为什么使用。请明确说明。谢谢。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

}

【问题讨论】:

  • 这是 Swift 2 代码,无论如何在 Swift 5 中都不起作用。如果方法已经存在于类或结构中并且您希望(或需要)更改其功能,则必须重写该方法。
  • @vadian 这只是粘贴来询问问题的示例代码。但同样关注的是为什么以及何时使用覆盖
  • @Rob 请确认我的理解。如果我在我的 UITableViewController 中使用 UITableView 是否意味着我正在继承它并且需要在那里使用覆盖。如果在简单的 ViewController 中使用 UITableView 则可以使用表格视图方法而不使用覆盖,因为在那里没有子类化,反之亦然。
  • 是的,基本上就是这样。请参阅下面的my answer

标签: ios xcode uitableview overriding swift5


【解决方案1】:

简而言之,每当您实现基类已实现的方法或属性时,您都需要覆盖限定符。例如,当您在UIViewController 子类中实现viewDidLoad 时,您需要指定override,因为您正在覆盖已经在UIViewController 中实现的viewDidLoad 方法。

有关覆盖的更多信息,请参阅The Swift Programming Language: Inheritance: Overriding

因此,对于带有表格视图的场景,您将看到以下两种基本模式之一:

  1. 如果您已将 UIViewController 子类化并添加了您自己的 UITableView,您将拥有如下实现:

    class ViewController: UIViewController {
        @IBOutlet weak var tableView: UITableView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            ...
        }
    }
    
    // MARK: - UITableViewDataSource
    
    extension ViewController: UITableViewDataSource {
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            ...
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            ...
        }
    }
    

    在这种情况下,您会:

    • 在 Interface Builder (IB) 中,您可以将插座连接到表格视图;
    • 将视图控制器指定为表格视图的“数据源”(也可能是“委托”)(您可以直接在 IB 中执行此操作,也可以在您的 viewDidLoad 方法中以编程方式执行此操作);但是
    • 请注意,两个 UITableViewDataSource 方法上没有 override 关键字,因为 UIViewController 尚未实现这些方法。
       

    请注意,我在扩展中定义了与UITableViewDataSource 的一致性。 (请参阅The Swift Programming Language: Protocols: Adding Protocol Conformance with an Extension。)您不必这样做,但如果您在扩展中声明协议一致性,它可以使视图控制器中的代码井井有条。它不仅清晰明确,而且如果您在 Xcode 中进行代码折叠(您可以折叠代码的各个部分,以便您可以专注于代码的其他部分)。养成一个好习惯。

  2. 或者,如果您要继承 UITableViewController,那么您需要在这两个数据源方法上声明 override,因为您要覆盖已经在基类中声明的这两个方法,@ 987654339@:

    class ViewController: UITableViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
    
            ...
        }
    }
    
    // MARK: - UITableViewDataSource
    
    extension ViewController {
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            ...
        }
    
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            ...
        }
    }
    

    显然,当使用UITableViewController:

    • 您不必在 IB 中声明 tableView 出口或指定数据源或委托;
    • 您没有明确指定UITableViewDataSource 一致性(因为基类UITableViewController 已经符合该协议);但是
    • 您必须在这些 UITableViewDataSource 方法的实现中包含 override 关键字。

就您何时使用一种方法而不是另一种而言,这是您的 UI 中存在什么的问题。如果您可以将表视图作为视图控制器场景的根视图,那么UITableViewController 可能会更简单一些。但是,如果您的视图控制器的场景可能包含其他控件,而表格视图可能不会占据整个场景,那么您将希望采用UIViewController 模式,您可以在情节提要场景中添加您可能需要的任意数量的插座和控件.

【讨论】:

    【解决方案2】:

    这取决于您是继承UIViewController 还是UITableViewController

    UITableViewController 符合UITableViewDataSource 协议并提供两个必需函数的实现,tableView(_ tableView: UITableView, numberOfRowsInSection section: Int)tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)。您必须添加 override 关键字以确认您正在覆盖 UITableViewController 子类中的超类函数。

    UIViewController 不符合 UITableViewDataSource 协议 - 您需要自己在类定义中或通过扩展添加此一致性。由于您要添加一致性,因此没有所需函数的超类实现供您覆盖。

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多