App
動態更新一、控件到 window
的層級關係:git
二、分析控件的詳細路徑:github
三、動態修改控件:算法
四、工具篇:windows
每一個 App
, 至少有一個根 Window
, 一般狀況下咱們只用一個 。window
有一個 rootViewController
, 這就是咱們所謂的根視圖 , 咱們全部的控制器都是放在 rootViewController
裏面的。數組
這個是最簡單的層級關係服務器
若是在項目裏有了這麼一個路徑 , 咱們能夠作什麼呢?app
在當項目很複雜 , 能夠其它地方能夠直接修改這個控件的狀態函數
當某個控件命名存在卻又沒有顯示出來 , 能夠經過路徑來輔助查找工具
由服務器下發一些配置 , 使用 Runtime
去動態的修改已上線的項目佈局
下面將介紹如何使用代碼來找出這些視圖(控件)的路徑
Window
:每個視圖、控件 , 他們最終的根都是main函數返回的 application
, 經過 [UIApplication sharedApplication]
能夠獲得 。 application
的 windows
屬性是一個數組 , 這裏面裝的是這個應用的全部 Window
, 咱們一般用的是第一個也就是 application.windows[0]
獲得了 window
對象一切都好辦了 。 而後拿到 window
的 rootViewController
, 在獲取 rootViewController
裏面全部的 childViewControllers
和 view
裏的 subviews
, 一直遞歸下去就能夠獲得當前屏幕裏全部視圖對象了 , 同時能夠經過 runtime
把它們的 property
、delegate
都獲取出來。
結合 Reveal
或者 Xcode
自帶的 Captuer View Hiearachy
, 咱們能夠推測一下這兩個的的實現原理了 :
一、根據應用獲得根視圖
二、遞歸獲取裏面的全部控件
三、按照他們的層級關係一層一層的畫出來
一、把上面獲取到的全部控件的詳細信息上傳到服務器 。
二、根據業務需求由服務器給咱們下發對應的配置列表,以 button
爲例 : 配置列表裏必需要有 :
1)、
button
的全路徑 : 如UIWindow
->UIWindow
->UIView
->UIView
->UILayoutContainerView
->UITabBar
->UIView
—>UIButton
2)、button
的惟一標識 : 如tag
值或本身實現的一套算法生成的惟一標識 , 目的是防止與button
同一層次的視圖搞混 。
3)、 根據路徑及惟一標識來匹配App
裏的控件 , 匹配和上面的查找原理是相通的。
4)、 匹配成功表明button
確實存在 , 根據業務需求作後續操做 。
提示: 匹配策略儘量的多 , 防止意外狀況某一兩個標識生成失敗或者生成相同 。
三、修改 button
的狀態。
1)、 如某個按鈕點了會
Crash
或暫時不須要被點擊 , 可是又要展現出來 , 能夠直接修改button
的enabled
屬性 。
2)、 如某業務暫時關閉 , 能夠直接修改入口按鈕
frame爲0 , 前提是要自動佈局已作好 。
3)、 如給購買按鈕
添加監聽事件addTarget: action: forControlEvents:
target
也能夠經過上面遍歷視圖
獲取到 ,action
能夠由服務器下發 , 也能夠一開始就寫死 , 等有需求的時候直接傳不一樣的參數就好了 。
四、 綁定查找控件時 , 這個界面必需要已經初始化完成了才行 , 假如界面還沒生成確定是查找不到這個控件的 。 這裏給你們提供兩種思路 :
一、使用Runtime
Method Swizzing
, 直接把修改控件的方法與didMoveToSuperview
和didMoveToWindow
動態綁定 , 等這個控件加載出來以後再去修改 , 查找路徑正確的話確定就能找到了 。
二、在具體的類裏面 , 等控件的初始化方法調用完後 , 再去執行動態修改 , 如在viewDidLoad
裏面初始化控件 , 在viewWillAppear:
裏面動態修改 。
建議使用第一種適用範圍更強 。
上架後的 應用
可能會遇到的一些突發情況 , 未測出的Crash
、臨時改點小需求 , 等等 , 咱們總不能每次由於一點小改動就從新提交一次 App Store
, 先不說 App Store
的審覈時間 , 頻繁的讓用戶去更新應用 , 用戶也會煩的 。使用這篇文章所講的來實現動態更新是再合適不過了 。
首先上面講的 動態更新
是徹底脫離出來的一個模塊 , 跟業務邏輯沒有任何關係 , 只須要部署一次就好了 , 等開發下一個項目也能夠直接拿過去使用 。這裏的動態更新適用於局部的視圖、控件的修改 , 若是你有其它需求能夠考慮 JSPatch , 下發腳本也是一個不錯的選擇 。
使用一些UI調試的輔助工具 , 使咱們查看視圖在項目中得層次結構更爲方便 。
經常使用的UI調試的工具:
Captuer View Hiearachy
Reveal
Xcode自帶的 Captuer View Hiearachy
實現步驟:
一、打開Xcode , 運行項目 , 選擇最頂部的 Debug
二、Debug
-> View Debugging
-> Show View Frames
三、Debug
-> View Debugging
-> Captuer View Hiearachy
Xcode裏面就變成了三維的視圖了 , Xcode左側展現出來的是層級關係的樹狀圖 。
Reveal的功能相對來講更強大 , 適用於UI調試視圖查找 。使用方法請看 Reveal集成指南 。