天天看點

viewWithTag擷取subview規則詳解

擷取subview

  通常我們在view層級裡面對subView的操作可以通過兩種方式:1、保留一個subview的引用,然後在類中通過該引用對該subview進行操作,但是要注意在适當的位置添加記憶體維護的代碼,退出前手動釋放。2、設定subview的Tag,讓後在要使用的時候,通過viewWithTag擷取到相應的subview,這種方法比較簡潔,也不用自己去維護記憶體。

  ViewWithTag: 通常采用深度周遊優先的算法,傳回第一個tag和給定Tag相等的subview。這就導緻了一個當一個view的多個subview的tag相同的時候,我們通過該方法得到的view可能并不是自己想要的。

  下面通過一個小例子驗證一下,代碼如下:

viewWithTag擷取subview規則詳解
viewWithTag擷取subview規則詳解

SvTestViewTag.h

viewWithTag擷取subview規則詳解
viewWithTag擷取subview規則詳解

SvTestViewWithTag.m

  例子中代碼建立的view的層次圖如下:

viewWithTag擷取subview規則詳解

   例子中每個subview都是一個UILabel,而且設定了相應的内容。按鈕的響應函數的實作思路:首先隐藏所有類型為UILabel的subview(排除UIButton,因為button需要一直顯示),然後根據指定的Tag擷取到相應的subview,該subview及其superView的hidden屬性為NO。這樣就可以保證點選按鈕的時候隻顯示的是第一個tag和指定tag相等的subview。

  為了驗證viewWithTag擷取subview的原理:

  首先我在subview1中添加了兩個tag都為11的subview11和subview12。 運作程式可以,當我們點選"Show Tag 11"按鈕的時候螢幕上将顯示“SubView11”,而非“SubView12”。同時不管你點選幾次該按鈕,始終隻顯示“SubView11”。這樣可以看出來同一層級中擷取subview時候查找順序為index從小到大的原則,即位于相對下層的将首先被找到。

  其次我還在subview1中添加了tag均為13的subview13,同時向view中添加了tag也為13的subview2,運作程式點選“Show Tag 13”按鈕,螢幕上将會顯示“SubView13”,而非“SubView2”。這可以驗證viewWithTag在搜尋的時候遵循深度優先周遊的原則,即會首先查找最下層的view并遞歸查詢其subview。

  綜上兩點我們可以看出來viewWithTag擷取subview的基本原則,即遵循深度優先,下層優先兩個原則。

PS:在測試的時候我也發現隻要點選過“Show Tag 13”以後,再點選“Show Tag 11”将失去效果,不知道什麼原因,但是重新開機程式就會恢複正常。

  期待你們的答案!

  

部門招人: 進階iOS、Android、前端開發,有意私聊,部落客請你喝️

如果覺得本文幫到了你,記得點贊哦,當然也可以請部落客喝一杯豆漿

微信二維碼

QQ二維碼

繼續閱讀