2013-07-29 7 views
0

У меня есть четыре UIView s: viewA - это вид корня, в котором есть viewB в качестве подзаголовка. viewB имеет viewC в качестве подзаголовка и viewC имеет viewD в качестве подзаголовка. Таким образом, существует иерархия из четырех представлений. viewD - это в основном кнопка, которую можно использовать, чтобы что-то сделать. Поскольку операция связана с базой данных, это может занять некоторое время. Поэтому я хочу, чтобы темный непрозрачный UIView с UIActivityIndicator в центре, чтобы рассказать пользователю подождать некоторое время и предотвратить другие нажатия, которые могут вызвать проблемы. Тем не менее, темный вид должен быть помещен в viewA, чтобы он покрывал весь экран. Вот что я пробовал (и преуспел), но я хочу знать, есть ли более простые способы сделать это.Сделать UIView изменить свой супервизор (или супервизор)?

  1. Доступ viewA из viewD по viewD.superview.superview.superview. Однако он не очень гибкий, поскольку после изменения иерархии эта цепочка, вероятно, будет изменена.

  2. Использование делегирования. viewD.delegate = viewA. Тем не менее, viewD создан viewC (его прямым видом), который создается viewB, который создается по viewA. Так что, если viewD, viewC и viewB не @property его соответствующего суперкласса (доступ по viewA.viewB.viewC.viewD не представляется возможным), то viewA не может иметь указатель на viewD, что сделает невозможным делегирование (насколько я понимаю).

  3. NSNotification. Сделайте viewD сообщение @"ActivityIndicatorShouldBePutOn" и сделайте viewA наблюдателем этого. Однако NSNotification предназначенный для свободного эфирного телевидения. Так что это несколько неуместно.

  4. Пока этот случай идет (темная маска помещается на весь экран), я могу использовать что-то связанное с UIApplication, чтобы получить доступ к экрану и нанести его прямо на него. Но если я хочу поместить его только на часть экрана для другой цели, тогда это не сработает.

Поэтому я хочу спросить, есть ли лучший способ сделать это, или один из способов, упомянутых выше, является стандартным способом.

+0

У вас нет контроллера вида в игра? –

+0

@HermannKlecker Да У меня есть один, но поскольку 'viewD' создается' viewC', а не контроллером представления, то как может контроллер просмотра иметь какое-либо значение? – zyl1024

+0

У меня просто появилось ощущение, что вы должны использовать контроллер вида для создания своих представлений. Это должен быть стандартный способ, о котором вы просили. Если вы этого не хотите, вы должны использовать опцию 3 или добавить новый индикатор активности непосредственно в окно. (Афайк само окно не поворачивается к портрету или вверх ногами). –

ответ

1

вы можете использовать опцию 3, хотя ее трансляцию можно прослушать только с одним наблюдателем. то просто у меня есть разные уведомления для каждого UIView

Я бы сказал, что это самое простое/гарантированное исправление, хотя оно может быть не изящным, ничего неправильного с ним.

2

Вы можете добавить вид индикатора активности в главное окно. Вы можете получить keyWindow с помощью:

[[UIApplication sharedApplication] keyWindow]; 
2

Я рекомендовал бы этот API MBProgressHUD.Она имеет хороший внешний вид и мертв прост в использовании:

enter image description here

Отображение activityIndicator

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

Удаление его

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