2013-08-26 2 views
5

Neuer iOS-Entwickler, der die erste in Auftrag gegebene App für das iPhone schreibt.Mit View Controller Containment verlieren Kinder Elternteil

Modal aufgerufen Elternüberblick-Controller hat sechs Kinder, die mit einem segmentierten Steuerelement im übergeordneten übergeführt werden. Ich erhalte die Fehlermeldung:

Kinder-Controller anzeigen und müssen einen gemeinsamen übergeordneten View-Controller haben beim Aufruf - [UIViewController transitionFromViewController: toViewController: Dauer: Möglichkeiten: Animationen: Abschluss:]

wenn ich eine zweite Taste drücken, dh ich kann eine beliebige Taste drücken, nachdem das Elternteil präsentiert wird und es funktioniert. Aber wenn ich das nächste Mal einen neuen Knopf drücke, bekomme ich den Absturz oben. Mit NSLogs habe ich festgestellt, dass der Grund für den Absturz ist, dass sowohl das aktuelle als auch das neue Kind ihre Eltern zwischen den Tastendrücken verloren haben. Ich habe keine Idee warum. Relevent Code für Eltern folgt:

Code-Schnittstelle:

#import <UIKit/UIKit.h> 
#import "WorksheetScrollViewController.h" 
#import "Worksheet1ViewController.h" 
#import "Worksheet2ViewController.h" 
#import "Worksheet3ViewController.h" 
#import "Worksheet4ViewController.h" 
#import "WorksheetEndViewController.h" 


@interface WorkSheetParentViewController : UIViewController 
{ 
IBOutlet UISegmentedControl *segControl; 
IBOutlet UIBarButtonItem *doneButton; 
IBOutlet UIView *childContainerView; 

WorksheetScrollViewController *wStart; 
Worksheet1ViewController *w1; 
Worksheet2ViewController *w2; 
Worksheet3ViewController *w3; 
Worksheet4ViewController *w4; 
WorksheetEndViewController *wEnd; 

UIViewController *currentVC; 
UIViewController *newVC; 

} 


-(void)initToolbar; 
-(IBAction) doneButtonPressed:(id)sender; 
-(IBAction) segControlChanged:(id)sender; 

-(void)swapViewControllers; 

Code Implementierung:

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view from its nib. 
wStart = [[WorksheetScrollViewController alloc  ]initWithNibName:@"WorksheetScrollViewController" bundle:nil]; 

[self addChildViewController:wStart]; 
wStart.view.frame=childContainerView.bounds; 

[childContainerView addSubview:wStart.view]; 
[wStart didMoveToParentViewController:self]; 
currentVC = wStart; 

} 

- (IBAction) segControlChanged:(id)sender 

{ 

NSLog(@"selected tab bar item:%i",segControl.selectedSegmentIndex); 
switch (segControl.selectedSegmentIndex) { 
    case 0: 
     if (!wStart) { 
      wStart = [[WorksheetScrollViewController alloc ]initWithNibName:@"WorksheetScrollViewController" bundle:nil]; 
     } 
     newVC = wStart; 
     break; 

    case 1: 
     if (!w1) { 
      w1 = [[Worksheet1ViewController alloc ]initWithNibName:@"Worksheet1ViewController" bundle:nil]; 
     } 
     newVC = w1; 
     break; 

    case 2: 
     if (!w2) { 
      w2 = [[Worksheet2ViewController alloc ]initWithNibName:@"Worksheet2ViewController" bundle:nil]; 
     } 
     newVC = w2; 
     break; 

    case 3: 
     if (!w3) { 
      w3 = [[Worksheet3ViewController alloc ]initWithNibName:@"Worksheet3ViewController" bundle:nil]; 
     } 
     newVC = w3; 
     break; 

    case 4: 
     if (!w4) { 
      w4 = [[Worksheet4ViewController alloc ]initWithNibName:@"Worksheet4ViewController" bundle:nil]; 
     } 
     newVC = w4; 
     break; 

    case 5: 
     if (!wEnd) { 
      wEnd = [[WorksheetEndViewController alloc ]initWithNibName:@"WorksheetEndViewController" bundle:nil]; 
     } 
     newVC = wEnd; 
     break; 


    default: 
     break; 
} 
[self swapViewControllers]; 


} 

-(void)swapViewControllers 
{ 
NSLog(@"top current VC parent = %@",currentVC.parentViewController); 
NSLog(@"top new VC parent = %@",newVC.parentViewController); 
[currentVC willMoveToParentViewController:nil]; 
newVC.view.frame=childContainerView.bounds; 

[self addChildViewController:newVC]; 

NSLog(@"current VC parent = %@",currentVC.parentViewController); 
NSLog(@"new VC parent = %@",newVC.parentViewController); 
[self transitionFromViewController:currentVC 
        toViewController:newVC 
          duration:1.0 
          options:UIViewAnimationOptionTransitionCurlUp 
         animations:nil 
         completion:^(BOOL finished) { 
          [currentVC removeFromParentViewController]; 
          [newVC didMoveToParentViewController:self]; 

         }]; 
currentVC = newVC; 
NSLog(@"bottom current VC parent = %@",currentVC.parentViewController); 
NSLog(@"bottom new VC parent = %@",newVC.parentViewController); 

} 

NSLog Ergebnisse zum Drücken der Taste 1, dann Taste 2:

2013-08-26 14:49:07.245 Alveolar Gas iPhone[556:707] selected tab bar item:1 
2013-08-26 14:49:07.251 Alveolar Gas iPhone[556:707] top current VC parent =  <WorkSheetParentViewController: 0x198da0> 
2013-08-26 14:49:07.256 Alveolar Gas iPhone[556:707] top new VC parent = (null) 
2013-08-26 14:49:07.437 Alveolar Gas iPhone[556:707] current VC parent = <WorkSheetParentViewController: 0x198da0> 
2013-08-26 14:49:07.440 Alveolar Gas iPhone[556:707] new VC parent = <WorkSheetParentViewController: 0x198da0> 
2013-08-26 14:49:07.460 Alveolar Gas iPhone[556:707] bottom current VC parent = <WorkSheetParentViewController: 0x198da0> 
2013-08-26 14:49:07.462 Alveolar Gas iPhone[556:707] bottom new VC parent = <WorkSheetParentViewController: 0x198da0> 
2013-08-26 14:49:13.984 Alveolar Gas iPhone[556:707] selected tab bar item:2 
2013-08-26 14:49:33.912 Alveolar Gas iPhone[556:707] top current VC parent = (null) 
2013-08-26 14:49:50.038 Alveolar Gas iPhone[556:707] top new VC parent = (null) 
2013-08-26 14:55:36.149 Alveolar Gas iPhone[556:707] current VC parent = (null) 
2013-08-26 14:55:36.153 Alveolar Gas iPhone[556:707] new VC parent = <WorkSheetParentViewController: 0x198da0> 
2013-08-26 14:55:36.160 Alveolar Gas iPhone[556:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Children view controllers <Worksheet1ViewController: 0x1ea780> and <Worksheet2ViewController: 0x1403b0> must have a common parent view controller when calling -[UIViewController transitionFromViewController:toViewController:duration:options:animations:completion:]' 
+0

Danke für das Posten. Ich arbeite auch an meinem ersten und hatte das gleiche Problem :) –

Antwort

5

Ich reparierte es durch Verschieben von currentVC = newVC; in den Abschlussblock. SwapViewControllers: sieht jetzt so aus:

-(void)swapViewControllers 
{ 
NSLog(@"top current VC parent = %@",currentVC.parentViewController); 
NSLog(@"top new VC parent = %@",newVC.parentViewController); 
[currentVC willMoveToParentViewController:nil]; 
newVC.view.frame=childContainerView.bounds; 

[self addChildViewController:newVC]; 

NSLog(@"current VC parent = %@",currentVC.parentViewController); 
NSLog(@"new VC parent = %@",newVC.parentViewController); 
[self transitionFromViewController:currentVC 
        toViewController:newVC 
          duration:1.0 
          options:UIViewAnimationOptionTransitionCurlUp 
         animations:nil 
         completion:^(BOOL finished) { 
          [currentVC removeFromParentViewController]; 
          [newVC didMoveToParentViewController:self]; 
          currentVC = newVC; 
         }]; 

NSLog(@"bottom current VC parent = %@",currentVC.parentViewController); 
NSLog(@"bottom new VC parent = %@",newVC.parentViewController); 

}