使用 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 视图的场景中,您将看到两种基本模式之一:
如果你有 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 中进行代码折叠(您可以折叠代码的各个部分,以便您可以专注于代码的其他部分)。养成好习惯。
或者,如果您要子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
模式,您可以在其中添加任意数量的插座和控件您可能需要的故事板场景。
在 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.
UIViewController
不符合 UITableViewDataSource
协议 - 您需要自己在 class 定义中或通过扩展添加此一致性。由于您要添加一致性,因此没有 superclass 所需功能的实现供您覆盖。
简而言之,每当您实现基 class 已实现的方法或 属性 时,都需要覆盖限定符。例如,当您在 UIViewController
子 class 中实现 viewDidLoad
时,您需要指定 override
因为您正在覆盖 viewDidLoad
中已经实现的方法13=]。
有关覆盖的详细信息,请参阅 The Swift Programming Language: Inheritance: Overriding。
因此在具有 table 视图的场景中,您将看到两种基本模式之一:
如果你有 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 中进行代码折叠(您可以折叠代码的各个部分,以便您可以专注于代码的其他部分)。养成好习惯。或者,如果您要子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
关键字。
- 您不必在 IB 中声明
就何时使用一种方法而不是另一种方法而言,问题在于你的 UI 中存在什么。如果您同意 table 视图作为视图控制器场景的根视图,那么 UITableViewController
可能更简单一些。但是,如果您的视图控制器的场景可能包含其他控件,其中 table 视图可能不会占据整个场景,那么您会希望采用 UIViewController
模式,您可以在其中添加任意数量的插座和控件您可能需要的故事板场景。