一次簡單的面向協(xié)議編程嘗試

最近在看POP(Protocol-Oriental Programming)方向的文章, 碰巧有個需求適合用POP解決, 記錄一下.

需求是這樣的:

當(dāng)前控制器, 就叫CurrentViewController吧, 需要Push到一個另外的控制器選擇一個Staff對象, 就叫StaffViewController吧, StaffViewController里會根據(jù)Staff所在的部門, 層級不同, 選擇的時候會push到不同的下一級控制器, 這些下一級控制器里裝著不同的Staff或者其他部門, 選擇其他部門又會不一樣的操作, 我需要這些不同的控制器在完成選擇Staff對象的時候都直接pop回CurrentViewController里.

我的協(xié)議是這樣設(shè)計(jì)的:

protocol StaffSelectable {

}  
extension StaffSelectable where Self: MyBaseViewController {

    func actionAfterSelectStaff(staff: ContactStaff, ifNotForSelectStaff: @escaping () -> Void) {
        if isDuringStaffSelection {
            // 進(jìn)行選擇后的操作
            // 跳轉(zhuǎn)回CurrentViewController
            self.popToCurrentViewController()
        } else {
            ifNotForSelectStaff()
        }
    }

    private func popToCurrentViewController() {
        for vc in self.navigationController?.viewControllers ?? [] {
            if vc.isKind(of: CurrentViewController.self) {
                self.navigationController?.popToViewController(vc, animated: true)
            }
        }
    }
}

在遵守這個協(xié)議的控制器種調(diào)用的代碼:

class SomeBaseViewController: MyBaseViewController, StaffSelectable {

        private func didSelectStaff(vc: UIViewController, staff: Staff) {
        self.actionAfterSelectStaff(staff: staff) {
            // 提供這個控制器在不是選Staff的用途時的功能
            self.navigationController?.pushViewController(someOtherViewController, animated: true)
        }
    }

}

這樣遵守這個協(xié)議的控制器在選完Staff的時候統(tǒng)一調(diào)這個方法就可以, 不用在基類定義方法, 更不用滿篇去CV代碼了??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容