2010-01-12 3 views
27

Протокол UIAlertviewDelegate UIAlertView имеет несколько дополнительных методов, включая:Можно ли НЕ уволить

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex; 

Это, казалось бы предположить, что не все щелчки кнопки на самом деле отклонить предупреждение вида. Однако я не вижу способа настроить вид предупреждения, чтобы НЕ автоматически отклоняться при нажатии любой кнопки.

Должен ли я создать подкласс для этого?

Почему бы UIAlertViewDelegate протокол есть:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex; 
- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex 

И

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex; 

Если это не возможно, поддерживать не отклоняя предупредительного вид с каждой кнопкой щелкнуть?

Краткое описание: Я понимаю, для чего был разработан UIAlertView. Но моя цель состоит в том, чтобы позволить пользователю копировать текст в склеенном картон перед выходом из приложения (которое происходит автоматически, когда предупреждение вида уволен.

ответ

27

Да. Подкласс UIAlertView, а затем перегрузить -dismissWithClickedButtonIndex:animated:, например

@implementation MyAlertView 
-(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated { 
    if (buttonIndex should not dismiss the alert) 
     return; 
    [super dismissWithClickedButtonIndex:buttonIndex animated:animated]; 
} 
@end 

Неофициально вы можете определить метод

-(void)alertSheet:(UIAlertSheet*)sheet buttonClicked:(id)button; 

к дель egate, который сделает его обход -dismissWithClickedButtonIndex:animated:, но это недокументированный, поэтому я не знаю, подходит ли он для вас.

+0

То, что я делаю сейчас. Но из-за доступных методов делегата, похоже, мне не нужно. О хорошо ... –

+0

Существует недокументированный метод (не проверен), см. Редактирование. – kennytm

+0

Хм ... интересный. Слишком плохо, что они справились с использованием недокументированных API. –

3

willPresentAlertView:, didPresentAlertView:, alertView:willDismissWithButtonIndex: и alertView:didDismissWithButtonIndex: предназначены для отслеживания начала и конца анимации UIAlertView в.

Приложения, которые не нужно отслеживать анимации UIAlertView, могут просто использовать alertView:clickedButtonAtIndex:. Документы для этого метода говорят, что «приемник автоматически отклоняется после вызова этого метода».

+0

Спасибо, я пропустил этот последний фрагмент текста в документах. По-прежнему кажется излишним, чтобы иметь этот дополнительный метод, поскольку он по существу такой же, как willPresentAlertView ... –

+0

@ Darren: Спасибо и много в ios7 alertView: willDismissWithButtonIndex: этот метод дважды вызывает вызов. но ваше решение сэкономит мой день .. – TamilKing

1

ПРЕДУПРЕЖДЕНИЕ

Из некоторых источников я слышал, что некоторые приложения уже получили отклонены после этого процесса. Мне повезло в моем случае во время iOS6, поэтому я здесь . Используйте на свой страх и риск: -/

Подкласс - это лучший способ. Создать флаг bool для предупреждения должен остаться или нет.

Это Подкласс UIAlertView

// 
// UICustomAlertView.h 
// 

#import <UIKit/UIKit.h> 

@interface UICustomAlertView : UIAlertView 
{ 

} 
@property(nonatomic, assign) BOOL dontDisppear; 
@end 

// 
// UICustomAlertView.m 
// 

#import "UICustomAlertView.h" 

@implementation UICustomAlertView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

-(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated { 

    if(self.dontDisppear) 
     return; 
    [super dismissWithClickedButtonIndex:buttonIndex animated:animated]; 
} 
@end 

И это, как я использовал его в свой код

if(![txtUsername.text isEqualToString:@"admin"] && ![txtPassword.text isEqualToString:@"admin"]) 
{ 
    alertLogin.dontDisppear = YES; 
    alertLogin.message = NSLocalizedString(@"my_alert", nil); 
} 
else 
{ 
    alertLogin.dontDisppear = NO; 
    // proceed 
} 
+0

Я дал -1, причина в том, что из-за '' Класс UIAlertView предназначен для использования как есть и не поддерживает подклассы. Иерархия представления для этого класса является частной и должна не следует изменять "в https://developer.apple.com/library/ios/documentation/uikit/reference/UIAlertView_Class/UIAlertView/UIAlertView.html, поэтому реализация вашего пути будет противоречить процессу документирования и просмотра Apple, поэтому их приложение отклонено. Это было в течение нескольких лет, поэтому в то время, когда вы ответили на этот вопрос, это был неправильный ответ. – Popeye

+0

Может быть, но мое приложение одобрено в прошлом году (iOS 6). –

+0

Извините, но это не значит, что это правильно. Я представил приложение, прежде чем узнал об этом, и он прошел через процесс первоначального рассмотрения, после чего был отклонен, когда я представил обновление. Группа экспертов Apple - это только люди, которых они могут пропустить. Я знаю, хотя они все более строгие с iOS 7. Однако мой -1 был чисто потому, что этот ответ противоречит документации Apple, и вы не предупреждаете об этом. Если вы предостерегнете об этом, я с радостью удалю свой -1 – Popeye

1
#import "MLAlertView.h" 

@implementation MLAlertView 


-(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated { 
} 

-(void)dismissNow:(NSInteger)buttonIndex { 
    [super dismissWithClickedButtonIndex:buttonIndex animated:YES]; 
} 
2

На мой взгляд: Там нет причин, чтобы держать alertView. Даже если вы хотите сохранить его, просто подумайте о «повторном показе» его, сохранив ссылку, затем позвоните [alertView show] ==>НЕТ НУЖДАЕТСЯ В SUBCLASS НИЧЕГО. Хорошие новости, да?

+0

Это работает. Хотя при повторном всплывании появляется небольшое мерцание. – RajV

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