2013-08-26 48 views
5

新iOS开发人员为iPhone编写第一个委托应用程序。使用视图控制器遏制,孩子失去父母

模态调用父视图控制器有六个孩子,这些孩子在父代中使用分段控制进行过渡。我得到的错误:

儿童视图控制器,并且必须打电话时共同的父视图控制器 - [UIViewController中transitionFromViewController:toViewController:持续时间:选择:动画:完成:]

当我按下第二个按钮

,即,我可以在父母出现后按任何按钮,它的作品。但是当我下一次按下一个新按钮时,我会看到上面的崩溃。使用NSLog我已经确定,崩溃的原因是当前和新的孩子在按下按钮之后失去了他们的父母。我不知道为什么。父培训相关的代码如下:

接口码:

#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; 

执行代码:

- (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结果用于按压按钮1,按钮,然后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

感谢发布。我也在处理我的第一个问题,并有同样的问题:) –

回答

5

我固定它通过移动currentVC = newVC;进入完成块。 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); 

} 
相关问题