[英]Make a UIView change its superview (or superview's superview)?
我有四個UIView
: viewA
是根視圖, viewB
具有viewB
作為其子視圖。 viewB
有viewC
作為其子視圖和viewC
已viewD
作為其子視圖。 因此,存在四個視圖的層次結構。 viewD
基本上是一個可以點擊以執行某項操作的按鈕。 由於該操作與數據庫有關,因此可能需要一段時間。 因此,我想要一個帶有UIActivityIndicator
不透明深色UIView
,以告訴用戶稍等片刻,並防止其他可能引起麻煩的輕擊操作。 但是,必須將暗視圖放入viewA
,以使其覆蓋整個屏幕。 這是我嘗試(並成功)的方法,但我想知道是否有更簡單的方法可以做到這一點。
通過viewA
從viewD.superview.superview.superview
訪問viewD
。 但是,它不是非常靈活,因為一旦更改了層次結構,此鏈就可能會更改。
使用委托。 viewD.delegate = viewA
。 然而, viewD
通過創建viewC
其通過創建(其直接上海華) viewB
,其通過創建viewA
。 所以,如果viewD
, viewC
和viewB
不@property
其各自的超類(通過訪問viewA.viewB.viewC.viewD
是不可能的),那么viewA
不能有一個指針viewD
,這將使代表團不可能的(據我明白)。
使用NSNotification
。 使viewD
發布@"ActivityIndicatorShouldBePutOn"
通知,並使viewA
成為它的觀察者。 但是, NSNotification
用於廣播嗎? 因此有點不合適。
只要這種情況得以解決(在整個屏幕上都放置了黑色蒙版),我就可以使用與UIApplication
相關的內容來訪問屏幕並將其直接放在屏幕上。 但是,如果我只想出於其他目的將其放在屏幕的一部分上,那么它將無法正常工作。
因此,我想問一問是否有更好的方法或者上述一種方法是否是標准方法。
您可以將活動指示器視圖添加到主窗口。 您可以使用以下方法獲取keyWindow:
[[UIApplication sharedApplication] keyWindow];
我會推薦此API MBProgressHUD 。 它具有良好的外觀和感覺,並且易於使用:
顯示活動指示器
[MBProgressHUD showHUDAddedTo:self.view animated:YES];
移除它
[MBProgressHUD hideHUDForView:self.view animated:YES];
您可以使用選項3,即使它是廣播節目,也只能由1個觀察者收聽。 然后每個UIView都有不同的通知
我會說這是最簡單/有保證的修復,即使它可能不夠優雅,也沒有錯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.