gpt4 book ai didi

ios - 在子类中实现协议(protocol)方法

转载 作者:IT王子 更新时间:2023-10-29 05:53:18 25 4
gpt4 key购买 nike

考虑通过 Cocoapods 包含的模块中的以下代码(我正在使用 Eureka,但问题不应该与此相关):

open class FormViewController : UIViewController {  
}

extension FormViewController : UITableViewDelegate {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// some default implementation
}

/// some other UITableViewDelegate methods follow, but _NOT_ willDisplayCell
}

我正在尝试子类化 FormViewController 并为 tableView(_:willDisplay:forRowAt:) 添加一个实现(这是 UITableViewDelegate )。此方法在源 FormViewController 中没有实现:

import UIKit
import Eureka

class MyViewController: FormViewController {
override func viewDidLoad() {
let tableView = UITableView(frame: self.view.bounds, style: .grouped)
tableView.delegate = self
tableView.dataSource = self
self.tableView = tableView
self.view.addSubview(self.tableView!)

super.viewDidLoad()

form = Form()
let section = Section()
section.append(EmailRow(){
$0.tag = "email"
$0.title = "Email"
})
form += [section]
}

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
print("NOT CALLED")
}


override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("will be called")
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
print("GETS CALLED")
return super.tableView(tableView, cellForRowAt: indexPath)
}
}

/// somewhere else:
self.navigationController?.pushViewController(MyViewController(), animated: true)

通过此设置,将调用我覆盖的 tableView(_:cellForRowAt:) 版本(意味着 tableView.delegate 已正确设置)。 tableView(_:willDisplay:forRowAt:) 不会被调用。一旦我在 Eureka 中添加了一个空白实现,我就能够覆盖该方法。

问题:为什么 Swift 不使用父类(super class)中没有默认实现的方法?

最佳答案

我自己也注意到了这个问题,对我来说这似乎是一个错误。您有两个选择。

首先,您可以在您的扩展中实现委托(delegate)方法并在您的子类中覆盖它。这将确保调用该方法。

extension FormViewController : UITableViewDelegate {    
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// you can leave the implementation blank if you want
}
}

class MyViewController: FormViewController {
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
print("CALLED!!")
}
}

其次,您可以使用 Swift 3 之前的表示法声明该方法,它会起作用。这部分对我来说也像是一个错误(或同一个错误的所有部分)。我不推荐这个选项,因为它可能会在未来的 Swift 或 Xcode 版本中发生变化,而且通常感觉很老套。

extension FormViewController : UITableViewDelegate {    
// no willDisplayCell method
}

class MyViewController: FormViewController {
func tableView(_ tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
print("CALLED!!")
}
}

编辑:OP 将 UITableViewDelegate 方法放在扩展中这一事实不会导致问题。即使类本身 decalres 委托(delegate)也存在问题。

关于ios - 在子类中实现协议(protocol)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39999716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com