Ich versuche, einen Multiview-Controller für ein Spiel zu erstellen, in dem ein Root View Controller Ansichten freigibt, bevor er zu einer anderen Ansicht wechselt. Die Sub-View-Controller sind wiederum Sub-Root-View-Controller selbst, da sie andere View-Controller enthalten.Wie können Ansichten im Multiview-Controller ordnungsgemäß freigegeben und umgeschaltet werden?
Zum Beispiel wird mein singlePlayerViewController einen ShakeObjectViewController und möglicherweise andere haben. Wenn Sie zwischen den Ansichten Aktionssets verwenden und mit dem Anwendungsdelegaten als Delegat des Aktionsblatts arbeiten, funktioniert alles wie erwartet, wenn Sie von einer Einzelspieleransicht zu einer anderen wechseln.
Aber wenn ich versuche, einen neuen singlePlayerViewController mit den gleichen Init-Methoden zu erstellen, wirft der Debugger eine EXC _BAD
_ACCESS Fehler, wenn ich versuche, eine Unteransicht einfügen, nämlich shakeObjectViewController.view.
Initialisierung sieht wie folgt aus im Moment: Die AppDelegate das Fenster mit der Methode Standard init initialisiert,
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// Override point for customization after application launch
[window addSubview:rootViewController.view];
[window makeKeyAndVisible];
}
dann in der RootViewController.m der viewDidLoad,
if(singlePlayerViewController == nil) {
SinglePlayerViewController *singleController = [[SinglePlayerViewController alloc]
initWithNibName:@"SinglePlayerView" bundle:nil];
self.singlePlayerViewController = singleController;
[singleController release];
}
[self.view insertSubview:singlePlayerViewController.view atIndex:0];
Gefolgt von singlePlayerViewController .m,
- (void)viewDidLoad {
self.view.tag = kSinglePlayerView; // tag the view
ShakeObjectViewController *shakeController = [[ShakeObjectViewController alloc]
initWithNibName:@"ShakeObjectView" bundle:nil];
self.shakeObjectViewController = shakeController;
self.view = shakeController.view;
[shakeController release];
}
Beachten Sie, dass mein singlePlayerViewController keine Unteransichten einfügt, sondern stattdessen seine eigene Ansicht durch die Ansicht eines Unteransicht-Controllers ersetzt. (Sie wissen nicht, ob dies eine gute Praxis ist oder nicht:?:)
Wenn Ansichten wechseln, die AppDelegate führt die folgenden Schritte aus:
for(UIView *subview in [rootViewController.view subviews])
{
[subview removeFromSuperview];
}
[rootViewController.singlePlayerViewController release]
[rootViewController initMultiplayerView];
Wenn dann zurück zum Einzelspieler-Modus schalten, die gleiche Die init-Methode in der viewDidLoad von rootViewController.m wird ausgeführt, und der Debugger löst den Fehler auf dem "[self.view insertSubview: singlePlayerViewController.view atIndex: 0];" Linie.
Irgendwelche Ideen, warum eine neue Ansicht nicht erstellt wird? Ich habe versucht, den singlePlayerViewController auf Null zu setzen, anstatt zu veröffentlichen, aber dann wird der Fehler auf die "self.view = shakeController.view;" Linie. Es war mein Verständnis, dass, wenn die Ansichtseigenschaft derzeit Null ist, automatisch eine neue für Sie beim nächsten Zugriff auf die Ansicht erstellt wird.
Ist initWithNibName nur für die einmalige Ausführung gedacht? Oder ist mein Design in Bezug auf # View-Controller viel zu kompliziert?
Die Singleplayer-Ansicht wechselt möglicherweise zwischen anderen Ansichten, nicht nur die Shake-Ansicht. Es wurde versucht, die Zeile "if (singlePlayerViewController == nil)" zu kommentieren und trotzdem einen neuen Controller zu instanziieren. Derselbe Fehler. "NSLog (@" shake's view =% @ ", shakeController.view);", wirft den gleichen Fehler. – oohaba
Es wurde auch versucht, den Controller des Einzelspieler-Views komplett zu überspringen und shakeObject VC direkt im Root-Controller zu verwenden. Derselbe Fehler. Switching BTW Ansichten funktioniert gut, wenn ich nicht versuche, sie zu veröffentlichen, aber ich brauche jedes Mal eine neue Ansicht. danke für die Antwort. – oohaba
Sind alle Ihre @property-Anweisungen mit "retain" gekennzeichnet? –