2013-07-29 73 views
0

我有四個UIView s:viewA是根視圖,vhich有viewB作爲它的子視圖。 viewB具有viewC作爲其子視圖並且viewC具有viewD作爲其子視圖。所以有四個視圖的層次結構。 viewD基本上是一個按鈕,可以挖掘做些什麼。由於該操作與數據庫有關,因此可能需要一段時間。所以我想要一個黑暗不透明的UIView,中心有一個UIActivityIndicator,告訴用戶等待一會兒,並阻止其他可能導致麻煩的點擊操作。但是,必須將暗視圖放入viewA才能覆蓋所有屏幕。以下是我嘗試(併成功)的內容,但我想知道是否有更簡單的方法來完成此操作。讓一個UIView改變其超視圖(或superview的超視圖)?

  1. viewD通過viewD.superview.superview.superview訪問viewA。然而,它不是很靈活,因爲一旦層次結構發生變化,這個鏈條很可能會改變。

  2. 使用代表團。 viewD.delegate = viewA。但是,viewDviewC(它的直接超視圖)創建,其由viewB創建,其由viewA創建。所以,如果viewDviewCviewB不是其各自的超類的@property(由viewA.viewB.viewC.viewD訪問是不可能的),那麼viewA不能有一個指針viewD,這將使代表團不可能的(據我所知)。使用NSNotification。讓viewD發佈@"ActivityIndicatorShouldBePutOn"通知,並讓viewA成爲觀察者。但是,NSNotification用於播放權嗎?所以這有點不合適。

  3. 只要這種情況發生(黑色面具放在整個屏幕上),我可以使用與UIApplication相關的東西來訪問屏幕並將其直接放到屏幕上。但是,如果我只想將它放在屏幕的一部分上以實現不同的目的,那麼這是行不通的。

所以我想問一下是否有更好的方法去做,或者上面提到的一種方法是否是標準方法。

+0

你不必在一個視圖控制器遊戲? –

+0

@HermannKlecker是的,我有一個,但是因爲'viewD'由'viewC'創建,而不是視圖控制器,那麼視圖控制器怎麼會有所作爲? – zyl1024

+0

我剛剛覺得應該使用視圖控制器來創建視圖。這應該是你問的標準方式。如果你不想那麼做,那麼你應該使用選項3或直接將新的活動指示器thingy添加到窗口。 (Afaik窗口本身不會旋轉爲縱向或倒置。) –

回答

1

即使是廣播,也可以使用選項3,但只能用1個觀察者來聽。然後只是有不同的通知爲每個UIView

我會說,這是最簡單/有保證的修復,即使它可能不優雅,沒有錯。

2

您可以將活動指示器視圖添加到主窗口。您可以使用獲得keyWindow:

[[UIApplication sharedApplication] keyWindow]; 
2

我會推薦這個API MBProgressHUD。它具有良好的外觀和感覺,是死易於使用:

enter image description here

顯示activityIndi​​cator

[MBProgressHUD showHUDAddedTo:self.view animated:YES]; 

刪除它

[MBProgressHUD hideHUDForView:self.view animated:YES]; 
相關問題