讀古今文學網 > iOS編程基礎:Swift、Xcode和Cocoa入門指南 > 13.2 關係可見性 >

13.2 關係可見性

對象可以通過其在所包含的結構中的位置獲取自動看到彼此的能力。在考慮如何向一個對像提供另一個對象的引用前,請先看看它們之間是否存在從一個到另一個的引用鏈。

比如,子視圖可以通過其superview屬性看到其父視圖。父視圖可以通過其subviews屬性看到其所有子視圖,並且可以通過該子視圖的tag屬性(調用viewWithTag:)獲取到特定的子視圖。窗口中的子視圖可以通過其window屬性看到其窗口。這樣,通過這些屬性並沿著視圖層次體系向上或向下查找,一個對象可以獲得所需的引用。

與之類似,響應器(參見第11章)可以通過nextResponder方法看到響應器鏈中的下一個對象,這意味著,根據響應器鏈的結構,視圖控制器的主視圖可以看到視圖控制器。如下代碼來自於我所編寫的一個應用,我從一個視圖開始沿著視圖層次體係獲得了負責整個場景的視圖控制器引用(第5章也介紹了類似的示例):


var r = sender as! UIResponder
repeat { r = r.nextResponder! } while !(r is UIViewController)
  

與之類似,視圖控制器本身也是層次體系的一部分,因此也可以看到彼此。如果某個視圖控制器當前正通過另一個視圖控制器展現了一個視圖,那麼後者就是前者的presentedViewController,前者是後者的presentingViewController。如果某個視圖控制器是UINavigationController的孩子,那麼後者就是其navigationController。UINavigationController的可見視圖是由其visibleViewController所控制的。你可以從這些視圖中的任何一個通過其view屬性獲得視圖控制器的view,諸如此類。

所有這些關係都是公開的。如果能夠獲得這些結構或類似結構中的任何一個對象的引用,那麼你就可以通過引用鏈在整個結構中導航,並且可以操縱結構中的任何其他對象。