从超类调用由子类实现的协议方法。

3
我有多个继承自基本TableViewController类的TableViewController类,就像这样:

class BasicTableViewController: UITableViewController {
}

class SpecificTableViewController: BasicTableViewController {
}

class AnotherSpecificTableViewController: BasicTableViewController {
}

然后我创建了一个非常简单的协议,以添加刷新功能到特定的视图控制器类,像这样:

@objc
protocol Refreshable {
    func refresh()
}

我的特定视图控制器类可以按照以下方式实现该协议:

class SpecificTableViewController: BasicTableViewController, Refreshable {
    func refresh() {
        getSomeDataFromServer()
    }
}

现在的问题是:从BasicTableViewController中调用refresh方法的正确方式是什么?但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)。但是它没有起作用。希望能得到一些解释。

提前致谢!


为什么你不想让 BasicTableViewController 遵循 Refreshable 协议? - ilovecomputer
请看一下我对 riik 的解决方案的评论。我只想在视图控制器采用 Refreshable 协议时实现 refreshcontrol。如果您有更好的方法来进行检查,欢迎提出。 :) 这就是我所问的... - André Slotta
1个回答

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 {
}

在这种情况下的问题是,我的 viewDidLoad 中的检查不起作用,我需要仅在视图控制器实现 Refreshable 协议时才添加 refreshControl - André Slotta
这可能可行,尽管我会将 shouldBeRefreshable 方法标记为可选的,因为我不想在所有没有刷新功能的子视图控制器中实现它... - André Slotta
1
刚刚更新了答案 ;) 为了使方法可选,您可以使用协议扩展。 - riik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接