我有多个TableViewController
类继承自基本的TableViewController
类,如下所示:
class BasicTableViewController: UITableViewController {
}
class SpecificTableViewController: BasicTableViewController {
}
class AnotherSpecificTableViewController: BasicTableViewController {
}
然后我创建了一个非常简单的协议来为特定的viewcontroller类添加刷新功能,如下所示:
@objc
protocol Refreshable {
func refresh()
}
我的特定viewcontroller类可以实现这样的协议:
class SpecificTableViewController: BasicTableViewController, Refreshable {
func refresh() {
getSomeDataFromServer()
}
}
现在的问题是:从BasicTableViewController
调用刷新方法的正确方法是什么,它本身不符合Refreshable
协议?现在我正在做这样的事情(不确定它是否可行):
class BasicTableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let _ = self as? Refreshable {
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(Refreshable.refresh), forControlEvents: .ValueChanged)
self.refreshControl = refreshControl
}
}
}
在一开始我没有使用@objc
标记协议,并试图像这样构建选择器:#selector(refresh)
。虽然没有奏效。希望得到一些澄清。 :)
提前感谢!
答案 0 :(得分:1)
我会让Superclass
实施Refreshable
协议
protocol Refreshable {
func refresh()
func shouldBeRefreshable() -> Bool
}
//Making the protocol methods optional
extension Refreshable {
func refresh() {}
func shouldBeRefreshable() -> Bool { return false}
}
class SuperView: Refreshable {
func addRefreshControl() {
if shouldBeRefreshable() {
//Add Refresh Control
}else {
// Do Nothing
}
}
func shouldBeRefreshable() -> Bool {
//default
return false
}
}
//Refreshable Class
class ChildA: SuperView {
func refresh() {
print("Refresh in Child A")
}
override func shouldBeRefreshable() -> Bool {
return true
}
}
//Not Refreshable Class
class ChildB: SuperView {
}