2016-08-04 91 views
2

Wie präsentiert man einen UIAlertController aus einer anderen Klasse?Vorhandener "Controller" aus einer anderen Klasse in Objective-C

Ich möchte wissen, wie Sie die Wirkung einer Schaltfläche „OK“ in einem UIAlertController erfassen können, die in der Klasse B erstellt wurde, aber in der Klasse A.

präsentiert Dies ist, wie ich die Methode aufrufen, die die Benachrichtigung erstellt auf Klasse "Fehlerbehandler" von KlasseA:

ErrorHandler *handler = [[ErrorHandler alloc] init]; 
[self presentViewController:[handler alertWithInternetErrorCode] animated:YES completion:nil]; 

Und das ist die Umsetzung von alertWithInternetErrorCode im ErrorHandler.m:

- (UIAlertController *)alertWithInternetErrorCode{ 

    UIAlertController * alert = [UIAlertController 
           alertControllerWithTitle:@"Error" 
           message:@"No internet conneciton" 
           preferredStyle:UIAlertControllerStyleAlert]; 
    UIAlertAction * cancel = [UIAlertAction 
           actionWithTitle:@"Cancel" 
           style:UIAlertActionStyleCancel 
           handler:^(UIAlertAction * action) { 
            NSLog(@"cancelled"); 
           }]; 

    [alert addAction:cancel]; 
    return alert; 
} 

Noch einmal, ich möchte zu wissen, wie man diese Art von Objekten in anderen Klassen erstellen und trotzdem in der Klasse präsentieren kann, in der man sie nennt. Dazu gehört das Erfassen ihrer Aktionen. In diesem Fall wäre es die Aktion NSLog innerhalb der Schaltfläche "Abbrechen". Wäre es möglich, anstelle des NSLog auch eine Methode aufzurufen? Sagen wir eine Delegiertenmethode und navigieren Sie zurück zum Code in Klasse A?

+0

Pass gibt es eine View-Controller wie: - (void) presentAlertWithInternetErrorCodeOnController: (UIViewController *) Controller –

Antwort

0

2 Möglichkeiten:

die beste Option:

Führen Sie den Controller in das Verfahren wie folgt: - (UIAlertController *)alertWithInternetErrorCodeInPresenter: (UIViewController *) presenter

Anruf [presenter presentViewController: alert animated:YES completion:nil];

Wenn dies nicht möglich ist:


Bearbeiten - Aktionen erfassen:

- (void) presentAlertWithInternetErrorCodeInPresenter:(UIViewController<CustomAlertViewProtocol> *) presenter{ 

    UIAlertController * alert = [UIAlertController 
          alertControllerWithTitle:@"Error" 
          message:@"No internet connection" 
          preferredStyle:UIAlertControllerStyleAlert]; 
    UIAlertAction * cancel = [UIAlertAction 
          actionWithTitle:@"Cancel" 
          style:UIAlertActionStyleCancel 
          handler:^(UIAlertAction * action) { 
           [presenter cancelPressed];//Here's the key 
          }]; 

    [alert addAction:cancel]; 
    [presenter presentViewController: alert animated:YES completion:nil]; 
} 

In der ErrorHandler.h Datei, die Sie dieses Protokoll erklären muss:

@protocol CustomAlertViewProtocol 
- (void) cancelPressed; 
@end 

nun in jedem View-Controller .h-Datei, in die Sie verwenden möchten Bei dieser Methode müssen Sie dem Compiler mitteilen, dass Sie dem CustomAlertViewProtocol folgen:

Und in der .m müssen Sie das Protokoll Methode implementieren:

- (void) cancelPressed { 
    //Do whatever you want 
} 

nun tatsächlich eine Warnung zeigen:

ErrorHandler *handler = [[ErrorHandler alloc] init];//Or whatever initializer you use 
[handler presentAlertWithInternetErrorCodeInPresenter: self]; 
+0

Ich habe bereits die AlertView in Klasse B von Klasse A aufgerufen. Und ich habe die Warnung in Klasse A präsentiert (Klasse B gab den AlertViewController zurück). Ist es nun möglich, die Aktion "OK AlertButton" von der Klasse A abzufangen? Soll ich einen Delegierten in B erklären? oder ein? Das will ich herausfinden. –

+0

@MauricioPimientaSosa Siehe bearbeiten –