Несколько состояний просмотра в Интерфейсном Разработчике - PullRequest
4 голосов
/ 25 февраля 2011

Я работаю на экране, который имеет 3 состояния:

  • Пользователи
  • Загрузка
  • Error

Первые два довольно просты, так как есть только изменение текста метки. Третий сложнее, потому что мне нужно показать сообщение об ошибке и нажать кнопку «Повторить».

Кроме того, я хотел бы, чтобы все это было под одним контроллером (это, наверное, самая легкая часть).

Вопрос: как мне сделать несколько состояний просмотра в Интерфейсном Разработчике? Кто-нибудь делал это раньше? Или я поступаю неправильно?

Ответы [ 4 ]

4 голосов
/ 11 марта 2011

Вы можете попытаться добавить дополнительные представления, которые вы добавляете или удаляете по мере необходимости. В окне «Владелец файла», «Первый ответчик», «Просмотр» и т. Д. Добавьте три UIView из библиотеки. Вы можете изменить их имена с «Вид» на «Проверка», «Загрузка» и «Ошибка».

Теперь откройте каждый и настройте его, как вам нравится, добавляя кнопки и метки и другие подобные вещи.

Вернувшись в XCode, объявите новые представления:

IBOutlet UIView *validView;
IBOutlet UIView *loadView;
IBOutlet UIView *errorView;

и обязательно сделайте соответствующие подключения в InterfaceBuilder. Любые действия, которые вы хотите связать с любым из этих представлений, должны работать отлично.

Теперь для переключения создайте действие (или три разных). Это может быть IBAction или нет, как вам нравится. В шапке:

-(void)showError;

Теперь для реализации вы можете захотеть что-то вроде этого.

-(void)showError {
  // skip this if you always arrive from the validView
  if ([validView superview]) {
    [validView removeFromSuperview];
  } 
  [self.view addSubview:errorView];
}

Вы можете полюбить анимацию, если хотите:

    -(void)toggleErrorWithFlip {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.8];
    [UIView setAnimationTransition:([errorView superview] ? UIViewAnimationTransitionFlipFromLeft : UIViewAnimationTransitionFlipFromRight) 
                           forView:[self view]
                             cache:YES];
    if ([errorView superview]) {
        [errorView removeFromSuperview];
    } else {
        [[self view] addSubview:errorView];
    }
    [UIView commitAnimations];
}

Кнопка «Повторить» может вызвать действие в следующих направлениях:

-(IBAction)retryLoad {
  [errorView removeFromSuperview];
  [self.view addSubview:validView];
  // do some stuff that retries whatever was tried and failed
}

Опять же, это может происходить с анимацией или без нее.

Если есть представление по умолчанию, к которому вы всегда обращаетесь (например, validatingView), то сделайте это первоначальным «View» и просто добавьте два других представления (например, loadView и errorView) поверх него. Это может сэкономить немного работы в зависимости от того, как вы хотите, чтобы дела шли.

1 голос
/ 10 марта 2011

То, что вы делаете, зависит от используемого макета. Самый простой подход, который я использовал несколько раз, - это разметить все элементы управления и просто пометить их группы как скрытые / не скрытые в таких методах, как:

- (void) showErrorModeControls
{
    self.errorLabel.hidden = NO;
    self.errorButton.hidden = NO;
    self.regularLabel.hidden = YES;
    self.regularButton.hidden = YES;
}

Вы также можете создавать анимацию, плавно увеличивать / уменьшать и т. Д. Это один из способов.

Другой способ - сгруппировать элементы управления в подпредставления основного вида и показать / скрыть эти подпредставления в целом. Это работает только в том случае, если вам удастся упорядочить все представления таким образом, чтобы при отображении нескольких видов вы могли видеть содержимое других представлений. Вы можете использовать фоны clearColor для достижения этой цели. Преимущество этого подхода заключается в том, что вы можете расположить элементы управления в отдельных подпредставлениях отдельно в конструкторе интерфейсов (вы делаете это с помощью хитрого трюка: просто установите для координаты X кадров других представлений значение 320 (или любое другое, подходящее для ваш вид), чтобы "убрать их с пути" вида, который вы хотите отредактировать. Затем вы вернете их к X координат 0, когда вы закончите.

Еще один подход, который я использовал, состоит в том, чтобы иметь целые «страницы» представлений, например, мини-навигационный контроллер вида, и самостоятельно вставлять и выводить эти представления, анимируя их кадры «на экране» и «вне экрана». Вы можете использовать один и тот же прием в построителе интерфейса выше, чтобы работать с этими «страницами» подпредставлениями по одному.

1 голос
/ 25 февраля 2011

Ваша ошибка кажется отличным кандидатом на UIAlertView

//wherever error is detected
UIAlertView *alert = [[UIAlert View alloc] initWithTitle:@"Error" message:@"An error occured" delegate:self cancelButtonTitle:@"Forget It" otherButtonTitles:@"Retry", nil];
[alert show];
[alert release];

//implement the delgate method
- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated         {
  switch(buttonIndex) {
    case 0:
    break;
    case 1:
    break;
    default
    break;
  }
}

Вы также должны будете реализовать UIAlertViewDelegate в своем заголовке!

0 голосов
/ 10 марта 2011

Если вам нужны пользовательские оповещения, вы можете использовать класс TSAlertView .Он работает довольно хорошо, и его легко развернуть.Он выглядит как UIAlertView, но вы можете настроить его с помощью UITextView, нескольких кнопок с легендами и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...