2010-06-04 1 views
0

Я делаю частичный оверлейный модальный код в своем приложении с кодом из «Полумодальных (прозрачных) диалогов на iPhone» на ramin.firoozye.com. При этом кнопка, которая вызывает модальную, все еще видна и доступна для клика. Я скрою эту кнопку, когда модальная нерестится, но я хочу быть уверенным, что если пользователь нажимает очень быстро дважды, новый модаль не появляется для каждого щелчка. Каков наилучший способ проверить, что модаль еще не существует, когда вы вызываете его нажатием кнопки?iPhone: создайте единый UIView из нескольких кликов

Вы можете download the test project here. Для тех, которые не имеют Xcode, соответствующие функции приведены ниже:

Я вызываю модально по нажатию кнопки с этим:

- (IBAction)displayModal:(id)sender { 
    ModalViewController *modalController = [[ModalViewController alloc] initWithNibName:@"ModalViewController" bundle:nil]; 
    modalController.view.frame = CGRectOffset(modalController.view.frame, 0, 230); 
    [self showModal:modalController.view]; 
} 

Затем использовать эту функцию, чтобы оживить пользовательский модальность по сравнению с текущим видом :

- (void)showModal:(UIView*) modalView { 
    UIWindow* mainWindow = (((TestAppDelegate*) [UIApplication sharedApplication].delegate).window); 

    CGPoint middleCenter = modalView.center; 
    CGSize offSize = [UIScreen mainScreen].bounds.size; 
    CGPoint offScreenCenter = CGPointMake(offSize.width/2.0, offSize.height * 1.5); 
    modalView.center = offScreenCenter; // we start off-screen 
    [mainWindow addSubview:modalView]; 

    // Show it with a transition effect 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.4]; // animation duration in seconds 
    modalView.center = middleCenter; 
    [UIView commitAnimations]; 
} 

Тогда я распускать модальный по нажатию кнопки с этим:

- (IBAction)dismissModal:(id)sender { 
    [self hideModal:self.view]; 
} 

А затем использовать эти функции для анимации модальный внеэкранное и очиститься:

- (void)hideModal:(UIView*) modalView { 
    CGSize offSize = [UIScreen mainScreen].bounds.size; 
    CGPoint offScreenCenter = CGPointMake(offSize.width/2.0, offSize.height * 1.5); 
    [UIView beginAnimations:nil context:modalView]; 
    [UIView setAnimationDuration:0.7]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(hideModalEnded:finished:context:)]; 
    modalView.center = offScreenCenter; 
    [UIView commitAnimations]; 
} 

- (void)hideModalEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context { 
    UIView* modalView = (UIView *)context; 
    [modalView removeFromSuperview]; 
    [self release]; 
} 

Любая помощь очень ценится!

ответ

0

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

Я положил это в моей навигации контроллере, где я называю модальность:

- (void)viewDidLoad { 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notShowingModal) name:@"ModalDidClose" object:nil]; 
    [super viewDidLoad]; 
} 

- (void)notShowingModal { 
    isShowingModal = NO; 
} 

Тогда я положил это в контроллере модального где уволенная модальный:

- (void)viewDidDisappear:(BOOL)animated { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ModalDidClose" object:nil]; 
} 

Я мог бы это сделать с AppDelegate. Если кто-нибудь подумает, что, или что-то еще, лучше подходит для этого, дайте мне знать.

0

Если я понимаю ваш вопрос, вы можете просто сделать: Sender.hidden = YES; В качестве первой линии в IBAction

Else, вы могли бы иметь BOOL Ивар в своем заголовке, как это:

{ 
    BOOL isShowingModal; 
} 

И положить в если заявление в displayModal и установите isShowingModal в YES

И в hideModal установите его на NO

+0

Я полагаю, что мне придется поместить свои функции скрытия в том же классе, что и функции show, чтобы поддерживать это условное. Спасибо за добавленный отзыв о скрытии кнопки, но ошибки Sender.hidden, которые отправитель не объявлен. [sender setHidden: YES]; компилирует, но запускает нераспознанный селектор, отправленный в экземплярную ошибку. Есть идеи? – Cuzog

+0

Из того, что я могу сказать, UIBarButtonItems нельзя скрыть. Они могут быть установлены только на ноль, а затем повторно инициализированы. Я намерен скрыть всю панель навигации, когда модальные дисплеи все равно, что, к счастью, имеет встроенный метод для обработки этого. – Cuzog

+0

А ... Да, я помню, что всегда очень раздражало то, что компилятор не позволит вам использовать синтаксис свойств в типе id (даже если он действительно работает).Я знаю, что это не поможет сейчас, но на будущее, если вы определите метод следующим образом: - (IBAction) doWhatever: (UIBarButtonItem *) отправитель , тогда все будет хорошо. Я, хотя вы использовали UIButton, который, насколько мне известно, может быть скрыт. Надеюсь, вам это удастся! Другой метод (хотя у вас уже есть рабочий) может состоять в использовании шаблона делегирования и задайте представление, которое имеет панель в качестве делегата модального. –

 Смежные вопросы

  • Нет связанных вопросов^_^