2017-02-21 3 views
0

У меня есть класс с именем ManagerClass.UIAlertAction - Изменить UIAlertAction после того, как было установлено

Класс менеджер имеет функцию showUIAlertController:

- (UIAlertController*)showUIAlertController:(NSString *)title message:(NSString *)message actions:(NSArray<UIAlertAction*>*)actions 

Эта функция должна показывать оповещения контроллер с параметрами, принятыми.

До сих пор так хорошо ...

Теперь я хотел бы принять эти действия и редактировать их каким-то образом. Что-то вроде:

UIAlertAction *action = actions.firstObject; 
UIAlertAction *actionCopyWithAdditionalAction = [UIAlertAction actionWithTitle:action.title style:action.style handler:^(UIAlertAction * _Nonnull action) { 

    [action "performTheAction"]; //perform the original action 
    [ManagerClass doSomething];   
}]; 

«performTheAction» не существует - это просто для вас, чтобы понять, что я пытаюсь добиться.

Есть ли у кого-нибудь идеи, как эта задача может быть достигнута?

Не нашли способ сделать это, глядя на UIAlertAction API от Apple https://developer.apple.com/reference/uikit/uialertaction

ответ

0

ли вы имеете в виду, чтобы выполнить метод, предоставленный код. Затем используйте:

[self performSelector:@selector(aMethod:)]; 

или при передаче объекта с:

[self performSelector:@selector(aMethod:) 
     withObject:(id)object]; 

Примечание, само здесь ссылается к тому же классу, что может быть еще где-то.

  • Edit *

    UIAlertController сигнал тревога * = [UIAlertController alertControllerWithTitle: @: @ "My Alert" сообщение "Это предупреждение." preferredStyle: UIAlertControllerStyleAlert];

    UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { 
          NSLog(@"42."); 
          }]; 
    
    [alert addAction:defaultAction]; 
    [self presentViewController:alert animated:YES completion:nil]; 
    

консоль выходит из 42. Поставьте вместо каждое действие вам нужно.

+0

Нет. Я хочу взять одно UIAlertAction, скопировать его как-то в новое действие и в рамках этого нового действия выполнить принятое действие + My Code. –

0

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

//Create the UIAlertController 
UIAlertController *theAlertController = [UIAlertController alertControllerWithTitle:@"Your Title" message:@"Your Message" preferredStyle:UIAlertControllerStyleAlert];

//Add an UIAlertAction which the user can click at [theAlertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { //Execute your own code //[self myOwnCode];

//Close the AlertController after your code [self dismissViewControllerAnimated:YES completion:nil]; }]]; dispatch_async(dispatch_get_main_queue(), ^{ [self presentViewController:theAlertController animated:YES completion:nil]; });

Надеюсь, я понимаю вас правильно.

+0

Представьте, что вы хотите менеджера UIAlertController. Такие, которые будут отвечать за предотвращение нескольких предупреждений, показываются один поверх другого. Поэтому для каждого действия менеджер хочет знать, что предупреждение было отклонено. Возможный способ сделать это, чтобы позволить менеджеру иметь функцию: - (UIAlertController *) showUIAlertController: (NSString *) Заголовок сообщения: (NSString *) действия сообщения: (NSArray *) действия И у менеджера создайте UIAlertController и добавьте к каждому действию некоторый код, который информирует менеджера о том, что действие было выполнено. Надеюсь, это действительно имеет смысл :) –

0

Вы можете передать модель действия предупреждения вместо UIAlertAction.

так что ваш метод будет выглядеть примерно так:

- (UIAlertController*)showUIAlertController:(NSString *)title message:(NSString *)message actions:(NSArray<MyActionModel*>*)actions 

где MyActionModel является классом с 3-мя свойствами

@interface MyActionModel: NSObject { 
    @property NSString * title; 
    @property UIAlertActionStyle * style; 
    @property ((void)^(UIAlertAction *)) action; 
} 

Тогда вы можете создать свой UIAlertAction сек, когда вы нуждаетесь в них, а также добавить в ваши обратные вызовы менеджера.

P.S. Извините, если мой Objective-C не совсем прав, я немного ржавый.

+0

Я использовал этот подход более или менее. Но использовал «runBlock» без входных или выходных параметров. Таким образом, я мог бы создать UIAlertAction и внутри его блока, запустить мой «runBlock». –

+0

Кажется, что Apple не предоставляет никакого способа редактировать UIAlertAction. –

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