6

Sto lavorando su un'app che presenta alcuni dati in un controllo ViewView detail. Ho un dirittoBarButton nella barra di navigazione che presenta un UIActivityViewController che è riempito con i miei oggetti sublimate UIActivity. La maggior parte di essi funziona bene poiché stanno solo cambiando un piccolo aspetto dei dati dalla vista di dettaglio, ma ho bisogno di uno di loro per aprire un modalViewController quando selezionato. Continuo a ricevere il seguente avviso dalla console .....Come posso presentare un ModalViewController da un oggetto UIActivity scelto da UIActivity View Controller?

Warning: Attempt to present <UINavigationController: 0x1fd00590> 
on <UITabBarController: 0x1fde1070> which is already presenting <MPActivityViewController: 0x1fd2f970> 

suppongo che la pena notare che l'applicazione non va in crash, ma la vista modale non appare neanche. Suppongo che UIActivityViewController sia una vista modale e che sia possibile visualizzarne solo uno alla volta, quindi il compito è capire come eseguire i miei passi dopo che ActivityView è scomparso, ma questo è il punto in cui sono bloccato. Accolgo con favore qualsiasi aiuto, pensieri o feedback. Ho provato google ma non ho avuto molta fortuna, presumo perché UIActivityViewController è così nuovo.

Qui è la mia messa a punto finora, miei oggetti UIActivity hanno un delegato impostato sul detailViewController per un protocollo personalizzato che consente al detailViewController effettuare le modifiche dei dati e quindi aggiornare la sua vista.

per le attività in questione che dovrebbero presentare il controller modalView Ho provato alcuni approcci che hanno tutti lo stesso avviso.


Nessuno di questi Lavori !!!


1) semplicemente tentato di eseguire segue dal mio metodo delegato

- (void) activityDidRequestTransactionEdit 
{ 
    NSLog(@"activityDidRequestTransactionEdit"); 
    [self performSegueWithIdentifier:@"editTransaction" sender:self]; 
} 

2) provato impostando un blocco completamento sulla UIActivityViewController ed avente mio metodo delegato impostato un flag booleano che la vista modale dovrebbe essere mostrato (self.editor)

[activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed) { 
    NSLog(@"completed dialog - activity: %@ - finished flag: %d", activityType, completed); 
    if (completed && self.editor) { 
     [self performSegueWithIdentifier:@"editTransaction" sender:self]; 
    } 
}]; 

3) sottoclasse della UIActivityViewController stessa, dando così il detailview come delegato, sovrascrivendole metodo con il mio blocco di completamento

- (void) dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion 
{ 
    [super dismissViewControllerAnimated:flag completion:^{ 
     [self.MPActivityDelegate activityDidRequestTransactionEdit]; 

    }]; 
} 

la soluzione di lavoro


Nella sottoclasse UIActivity è necessario eseguire l'override di questo metodo in questo modo

- (UIViewController *) activityViewController { 
    MPEditMyDataViewController *controller = [[MPEditMyDataViewController alloc] init]; 
    controller.activity = self; // more on this property below 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller]; 
    return navController; 
} 
: 's dismissViewControllerAnimated

nel tuo MPEditMyDataViewController.h (t egli View Controller l'azione scelta dovrebbe produrre) Hai bisogno di una proprietà indietro alla sottoclasse di attività in questo modo

@property (strong, nonatomic) MPEditMyDataActivity *activity; 

nel vostro MPEditMyDataViewController.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] 
            initWithBarButtonSystemItem:UIBarButtonSystemItemCancel 
            target:self 
            action:@selector(cancel)]; 

    self.navigationItem.leftBarButtonItem = cancelButton; 
} 
// here's how you dismiss the view controller when you are done with it 
// after saving the changes to your data or whatever the view controller is supposed to do. 
-(void) cancel 
{ 
    NSLog(@"Cancel Button Pushed"); 
    [self.activity activityDidFinish:YES]; 
} 
@end 

risposta

3

fatto un po 'di più la documentazione di scavo e ha trovato questo metodo per UIActivity sottoclassi

- (UIViewController *) activityViewController 

ottiene il mio controller di vista per far apparire come volevo ritornando da qui invece di cercare di Segue da il mio detailViewController. Ora per capire come liquidarlo quando ho finito !!!!

+0

Solo per il follow-up nel caso in cui qualcun altro ha problemi a vedere l'esempio di soluzione nella modifica sopra. – vichudson1

Problemi correlati