Использование UIAlertView в NSObject - PullRequest
7 голосов
/ 27 декабря 2011

У меня ужасное время, когда UIAlertView работает в моем собственном классе NSObject.В проведенном мною исследовании выяснилось, что это должно быть возможно, но вот что я натолкнулся.

Во-первых, вот мой код:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
  NSLog(@"clickedButtonAtIndex: %d", buttonIndex);
}

-(void)testAlertView {
  UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"List Contains Items"
                    message:@"List contains items.  Remove all items & delete?"
                    delegate:self
                    cancelButtonTitle:@"No"
                    otherButtonTitles:@"Yes", nil];
  [alertView show];
}

Если я задаю делегату selfэтот код вылетает, как только я нажимаю кнопку.Если я установил его на ноль, clickedButtonAtIndex никогда не вызывается.Я пытался использовать <UIAlertViewDelegate>.

и без него. Я знаю, что кто-то спросит: «Почему вы делаете это в NSObject, а не в UIViewController?».Прежде всего потому, что я хочу отделить этот код, чтобы я мог использовать его из нескольких мест в моем приложении.Но также потому, что это маленький кусочек большого логического блока, который имеет смысл быть сам по себе.

Есть идеи, что я делаю не так?

Спасибо, Рич

Ответы [ 3 ]

8 голосов
/ 16 июня 2012

У меня была такая же проблема при использовании ARC.Корень проблемы был такой же.Я решил это, поместив свой настраиваемый NSObject в «сильное» свойство, чтобы убедиться, что объект существует до тех пор, пока существует вызывающий объект (в моем случае UIVIewCOntroller), поэтому, когда вызывается делегат моего представления предупреждений, у меня все еще есть свой настраиваемый объект.объект вокруг, и метод делегата работает нормально.

1 голос
/ 16 октября 2015

Добавьте NSObject как сильное свойство:

#import "Logout.h" // is NSObject
.
.
.
@property (nonatomic, strong) Logout *logout;

Тогда вы получите методы делегата, вызываемые в вашем NSObject.

Не забудьте зарегистрировать делегата для UIAlertView:

@interface Logout () <UIAlertViewDelegate>

и в вашем методе:

UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"title" 
message:@"message" delegate:self cancelButtonTitle:@"cancel" 
otherButtonTitles:@"ok", nil];            

[a show];
0 голосов
/ 06 мая 2016

Как представить представление оповещения с помощью UIAlertController, когда у вас нет контроллера представления. Подробное описание .

Да, UIAlertController можно использовать только в классах UIViewController.Итак, как мы можем сделать это в классах NSObject.Если вы видите ссылку описания, приведенную выше, вы получите ответ.Подводя итог в строке для приведенного выше описания: Создайте новое окно над текущим окном.Это новое окно будет нашим viewController, где мы отображаем предупреждение.Поэтому с помощью этого viewController вы можете вызвать метод [presentViewController: animated: completion:].

Ответ:

dispatch_async(dispatch_get_main_queue(), ^{

                    UIWindow* window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

                    window.rootViewController = [UIViewController new];
                    window.windowLevel = UIWindowLevelAlert + 1;
                    NSString *msg=@“Your mssg";
                    UIAlertController* alertCtrl = [UIAlertController alertControllerWithTitle:@“Title" message:msg preferredStyle:UIAlertControllerStyleAlert];

                    [alertCtrl addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Yes",@"Generic confirm") style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {

                        // do your stuff
                        // very important to hide the window afterwards.                       
                        window.hidden = YES;

                    }]];

                    UIAlertAction *cancelAction= [UIAlertAction actionWithTitle:@"cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

                         window.hidden = YES; 

                    }];

                    [alertCtrl addAction:cancelAction];

                //http://stackoverflow.com/questions/25260290/makekeywindow-vs-makekeyandvisible

                    [window makeKeyAndVisible]; //The makeKeyAndVisible message makes a window key, and moves it to be in front of any other windows on its level
                    [window.rootViewController presentViewController:alertCtrl animated:YES completion:nil];

                });
...