2009-07-30 17 views
5

Ich möchte ein modales UITableView beim Start verwenden, um Benutzer nach Passwort usw. zu fragen, wenn sie nicht bereits konfiguriert sind. Der Befehl zum Aufrufen von "uitableview" scheint jedoch nicht innerhalb von "viewDidLoad" zu funktionieren.Kann presentModalViewController beim Start arbeiten?

Startcode:

- (void)viewDidLoad { 
    rootViewController = [[SettingsController alloc] 
    initWithStyle:UITableViewStyleGrouped]; 
    navigationController = [[UINavigationController alloc]  
    initWithRootViewController:rootViewController]; 

    // place where code doesn't work 
    //[self presentModalViewController:navigationController animated:YES]; 
} 

jedoch der gleiche Code funktioniert gut, wenn später durch einen Knopf genannt:

- (IBAction)settingsPressed:(id)sender{ 
    [self presentModalViewController:navigationController animated:YES]; 
} 

Verwandte Frage: Wie kann ich (auf der oberen Ebene) erfassen, wenn die UITableView hat den Befehl zum Beenden verwendet?

[self.parentViewController dismissModalViewControllerAnimated:YES]; 

Antwort

7

können Sie legen den presentModalViewController:animated: Anruf an anderer Stelle im Code - es sollte in der viewWillAppear Methode der View-Controller arbeiten, oder in der applicationDidFinishLaunching Methode in der AppDelegate (das ist, wo ich meine on-Start modal-Controller setzen).

Um zu wissen, wann der View-Controller verschwindet, können Sie eine Methode auf dem übergeordneten View-Controller definieren und die Implementierung von dismissModalViewControllerAnimated auf dem untergeordneten Controller überschreiben, um die Methode aufzurufen. Etwas wie dieses:

// Parent view controller, of class ParentController 
- (void)modalViewControllerWasDismissed { 
    NSLog(@"dismissed!"); 
} 

// Modal (child) view controller 
- (void)dismissModalViewControllerAnimated:(BOOL)animated { 
    ParentController *parent = (ParentController *)(self.parentViewController); 
    [parent modalViewControllerWasDismissed]; 

    [super dismissModalViewControllerAnimated:animated]; 
}
+0

versucht ViewWillAppear und bekam den gleichen schlechten Effekt wie viewdidload. Wenn ich [self presentModalViewController: navigationController animiert: YES]; In applicationDidFinishLaunch bekomme ich "SIGABRT". Ich rufe es wahrscheinlich falsch – BankStrong

+0

Kann es nicht von 'applicationDidFinishLaunching Tim

+1

Das war vielleicht unklar (sorry!); was ich meinte, war in 'applicationDidFinishLaunching', du kannst' [self present ...] 'nicht ausführen - stattdessen musst du' [self.viewController present ...] 'oder ähnliches ausführen, abhängig vom Namen deines View Controllers Objekt. – Tim

0

Wenn Sie gehen, um es so tun, dann werden Sie haben Ihr eigenes Protokoll zu erklären, der Lage sein, zu sagen, wann die UITableView die parent entlassen, so erklären Sie ein Protokoll, das eine Methode, wie

hat
-(void)MyTableViewDidDismiss 

dann in Ihrer übergeordneten Klasse können Sie dieses Protokoll implementieren und nachdem Sie in Tableview dismissModalView können Sie MyTableViewDidDismiss auf den Delegaten aufrufen (whihc die Steuerung übergeordneten Ansicht ist).

6

Ich hatte ziemlich das gleiche Problem. Ich weiß, das Thema ist alt, aber vielleicht könnte meine Lösung hilft jemand anderes ... Sie müssen nur Ihre modal Definition in einem Verfahren verschieben:

// ModalViewController initialization 
- (void) presentStartUpModal 
{ 
    ModalStartupViewController *startUpModal = [[ModalStartupViewController alloc] initWithNibName:@"StartUpModalView" bundle:nil]; 
    startUpModal.delegate = self; 

    [self presentModalViewController:startUpModal animated:YES]; 
    [startUpModal release]; 
} 

nächsten in viewDidLoad, rufen Sie Ihre modal Definition Methode in einem performSelector:withObject:afterDelay: mit 0 als Verzögerungswert. Wie folgt:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    //[self presentStartUpModal]; // <== This line don't seems to work but the next one is fine. 
    [self performSelector:@selector(presentStartUpModal) withObject:nil afterDelay:0.0]; 
} 

Ich verstehe immer noch nicht, warum der "Standard" Weg nicht funktioniert.

+0

Vielen Dank für das Posten. Ich habe tagelang versucht, das zur Arbeit zu bringen, und das hat ein ähnliches Problem gelöst. Wie du, ich habe keine Ahnung, warum die erste nicht funktioniert, aber die zweite - aber immer noch Problem gelöst. – gnuchu

+0

Danke!Das hat super funktioniert. –