寫在最前
? 以下方案的思路來自于項目組的同事LEAF
現狀
?在iOS開發(fā)中枉侧,對于根據不同的事件跳轉到不同的控制器這種操作,相信大家早已司空見慣老充,因此對于下面這樣的代碼福侈,一定不會陌生:
?也許有人問了,這代碼有什么問題谈飒?怎么說了岂座,其實代碼本身沒什么問題,如果跳轉事件不多杭措,更沒有什么問題费什,但是如果需要跳轉的控制器多達10個?20個手素?乃至更多的時候鸳址,你會就發(fā)現你的頭文件和方法列表大概就是這樣的:(為了不刷屏赘那,就只寫這么多,更多的可以想見氯质,代碼太美...)
問題
?這樣的代碼最大的問題就是耦合募舟,你當前的控制器必須 “# import ”所有要跳轉到的控制器頭文件,要知道對方什么類名闻察,包含對方的頭文件等拱礁,這會導致將來如果需要替換當前某個目標控制器,就不得不去修改所有import過他的地方辕漂,還難免出現遺漏呢灶,這儼然是個悲劇...
解決辦法
?遇到上面的問題怎么辦呢?理所當然的想法是钉嘹,將跳轉部分的代碼抽離出來鸯乃,讓當前控制器不再依賴目標控制器的頭文件,Good idea跋涣!問題是怎么抽離缨睡?
以下是我們項目的解決方案:
第一步:事件分發(fā)
?將每次跳轉的過程看成是一個跳轉事件,那么就可以新建一個繼承自NSObject的跳轉管理器陈辱,用來管理所有的這些事件奖年,也可以說成是“事件分發(fā)管理器”。使用者只需要傳入一個事件名稱沛贪,管理器就可以根據不同的事件來處理(目前我們項目還只是用來做跳轉事件分發(fā))陋守。iOS常見的一般就是跳轉到一個自定義的UIViewController或者AppStore兩種,所以管理器會提供兩個方法(跳轉AppStore是系統已經給定的控制器利赋,所以這里主要討論自定義的控制器跳轉水评。):
第二步:事件注冊
?聽起來很高大上對不對?其實代碼還是很簡單的媚送,直接上代碼吧中燥,更容易理解。
其實就是為了規(guī)范事件名稱的管理季希,如果事件散落各處褪那,對于后期管理和維護幽纷,簡直是災難式塌,這個相信程序猿都會懂。另外一點就是放在一起便于查錯友浸,對峰尝,就是為了查錯!
第三步:協議(重點收恢!重點N溲А)
?第二步的時候其實已經出現了“HPEventsProtocol”的影子祭往,問題是,這個用來干嘛火窒?又該怎么用呢硼补?
?對于程序猿來說,廢話太多是木有用的~~~熏矿。注釋什么的已骇,真的已經不能再詳細了,所以請直接看代碼:
?說完了協議票编,下面是說說怎么用的時候了褪储,畢竟是騾子是馬,它都得先溜完才知道慧域。
第四步:實現
1. 遵守協議(以HPNewsListViewController為例)
2. 實現協議方法(分為校驗參數以及生成實例兩步)
3. 事件分發(fā)管理器事件處理:
第五步:調用
?經過以上的操作后,現在跳轉已經不需要#import目標控制器啦昔榴,只要目標控制器遵守協議辛藻,并在注冊表中注冊,就可以直接使用以下方法進行調用:
?完成互订!是不是很簡單揩尸?代碼其實并不復雜,簡單才是硬道理屁奏,關鍵還是看方法岩榆。
寫在最后
?通過以上操作,我們就實現了一個事件分發(fā)控制器坟瓢,優(yōu)點主要體現在兩方面勇边,第一:不需要再在控制器中#import各種目標控制器。第二:當跳轉發(fā)生改變折联,或者原來的控制器不需要使用粒褒,而重新啟動新的控制器的時候,只需要改一個注冊表中對應的value就可以诚镰。
? 當然奕坟,該方法并不是說就完美或者是什么標準的方法,如果有朋友有更好的方法提供清笨,請分享給我月杉,謝謝!