使用 Override with UITableView 方法需要什么

What is the need of using Override with UITableView methods

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

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

}

这取决于你是classUIViewController还是UITableViewController

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

中的 superclass 函数

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

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

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

因此在具有 table 视图的场景中,您将看到两种基本模式之一:

  1. 如果你有 subclassed 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) 中,您可以将插座连接到 table 视图;
    • 将视图控制器指定为 table 视图的“数据源”(也可能是“委托”)(您可以直接在 IB 中执行此操作,也可以在您的 viewDidLoad 方法);但是
    • 请注意,两个 UITableViewDataSource 方法中没有 override 关键字,因为 UIViewController 尚未实现这些方法。

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

  2. 或者,如果您要子classing UITableViewController,那么您需要对这两个数据源方法进行 override 声明,因为您'正在覆盖已经在基 class、UITableViewController:

    中声明的那两个方法
    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 一致性(因为基础 class、UITableViewController 已经符合该协议);但是
    • 您必须在实施这些 UITableViewDataSource 方法时包含 override 关键字。

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