簡體   English   中英

使UIView更改其超級視圖(或超級視圖的超級視圖)?

[英]Make a UIView change its superview (or superview's superview)?

我有四個UIViewviewA是根視圖, viewB具有viewB作為其子視圖。 viewBviewC作為其子視圖和viewCviewD作為其子視圖。 因此,存在四個視圖的層次結構。 viewD基本上是一個可以點擊以執行某項操作的按鈕。 由於該操作與數據庫有關,因此可能需要一段時間。 因此,我想要一個帶有UIActivityIndicator不透明深色UIView ,以告訴用戶稍等片刻,並防止其他可能引起麻煩的輕擊操作。 但是,必須將暗視圖放入viewA ,以使其覆蓋整個屏幕。 這是我嘗試(並成功)的方法,但我想知道是否有更簡單的方法可以做到這一點。

  1. 通過viewAviewD.superview.superview.superview訪問viewD 但是,它不是非常靈活,因為一旦更改了層次結構,此鏈就可能會更改。

  2. 使用委托。 viewD.delegate = viewA 然而, viewD通過創建viewC其通過創建(其直接上海華) viewB ,其通過創建viewA 所以,如果viewDviewCviewB@property其各自的超類(通過訪問viewA.viewB.viewC.viewD是不可能的),那么viewA不能有一個指針viewD ,這將使代表團不可能的(據我明白)。

  3. 使用NSNotification 使viewD發布@"ActivityIndicatorShouldBePutOn"通知,並使viewA成為它的觀察者。 但是, NSNotification用於廣播嗎? 因此有點不合適。

  4. 只要這種情況得以解決(在整個屏幕上都放置了黑色蒙版),我就可以使用與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM