我們已經(jīng)對響應(yīng)者鏈條做了簡單的介紹 詳見我寫的響應(yīng)者鏈條 (http://www.reibang.com/p/2fb5c9b8ea4c)
小demo很簡單但是思想還算比較新穎, 如果我們在視圖嵌套比較深的情況下, 我們使用代理和block將便的不是很好, 這種情況下一般使用通知, 這時我們可以使用響應(yīng)者鏈條去實現(xiàn), 當然我們可以使用這種思想完成我們想要的一切行為..
思路:
我們要實現(xiàn)的是在view中 使用響應(yīng)者鏈條找到我們的導航控制器, 實現(xiàn)push跳轉(zhuǎn). (我們的實現(xiàn)是通過swift實現(xiàn)的, 如果感覺不適應(yīng)的但是對本文感興趣 請聯(lián)系我 Q2385560868)
本文的思路是, 我在一個view下去找他上層(可能是上上層, 也有可能是上上上層)UINavigationController控制器,根據(jù)控制器實現(xiàn)跳轉(zhuǎn)控制器
前提
我本文寫的東西是講控制器包在一個UINavigationController控制器下, 使用push完成對控制器的跳轉(zhuǎn).
原理
如何判斷當前響應(yīng)者的上一個響應(yīng)者是誰呢?
判斷當前是否是控制器的View,如果是控制器的View,那么上一個響應(yīng)者就是控制器如果當前不是控制器的view,上一個響應(yīng)者就是其父控件
響應(yīng)者.gif
1 我們使用sb嵌入一個UINavigationController控制器
// ViewController.swift
// 響應(yīng)者鏈條的控制器跳轉(zhuǎn)
// Created by Mac on 16/6/1.
// Copyright ? 2016年 www.ZXZ123.com. All rights reserved.
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.title = "測試響應(yīng)者鏈條"
view.addSubview(subView)
}
lazy var subView = ZXZView(frame: UIScreen.mainScreen().bounds)
}
2. 這是我們自定義的view
// ZXZView.swift
// 響應(yīng)者鏈條的控制器跳轉(zhuǎn)
// Created by Mac on 16/6/1.
// Copyright ? 2016年 www.ZXZ123.com. All rights reserved.
import UIKit
class ZXZView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = UIColor.grayColor()
let btn = UIButton(type: UIButtonType.Custom)
btn.frame = CGRectMake(100, 100, 100, 100)
btn.setTitle("點我點我", forState: UIControlState.Normal)
btn.setTitleColor(UIColor.orangeColor(), forState: UIControlState.Normal)
btn.setTitleColor(UIColor.redColor(), forState: UIControlState.Highlighted)
btn.addTarget(self, action: #selector(ZXZView.switchNextController), forControlEvents: UIControlEvents.TouchUpInside)
addSubview(btn)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc private func switchNextController(){
let targetVc = ZXZTargetViewController()
self.findNavController()?.pushViewController(targetVc, animated: true)
}
}
3. 我們創(chuàng)建一個UIView的分類: ( 實現(xiàn)查找當前view下的nav控制器)
import UIKit
extension UIView {
//查找視圖對象的響應(yīng)者鏈條中的導航視圖控制器
func findNavController() -> UINavigationController? {
//遍歷響應(yīng)者鏈條
var next = self.nextResponder()
//開始遍歷
while next != nil {
//判斷next 是否是導航視圖控制器
if let nextobj = next as? UINavigationController {
return nextobj
}
//如果不是導航視圖控制器 就繼續(xù)獲取下一個響應(yīng)者的下一個響應(yīng)者
next = next?.nextResponder()
}
return nil
}
}
4. 我們的目標控制器
// ZXZTargetViewController.swift
// 響應(yīng)者鏈條的控制器跳轉(zhuǎn)
// Created by Mac on 16/6/1.
// Copyright ? 2016年 www.ZXZ123.com. All rights reserved.
import UIKit
class ZXZTargetViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.yellowColor()
}
}
如果有任何疑問 請留言 我會第一時間去和你交流 如果感覺寫的還湊活 點個喜歡吧 ??
demo地址: https://github.com/greedyDoor/responseChainSwitchVC