Nuovo sviluppatore iOS che scrive la prima app commissionata per iPhone.Utilizzo del contenimento del controller di visualizzazione, i figli perdono il genitore
Il controller di visualizzazione genitore chiamato modamente ha sei figli che vengono trasferiti utilizzando un controllo segmentato nel padre. Sto ottenendo l'errore:
bambini visualizzare i controller e devono avere una vista di controllo genitore comune al momento della chiamata - [UIViewController transitionFromViewController: toViewController: durata: opzioni: animazioni: completamento:]
Quando si preme un secondo pulsante, cioè posso premere qualsiasi pulsante dopo che il genitore è presentato e funziona. Ma la prossima volta che premo un nuovo pulsante, ottengo il crash sopra. Usando NSLogs ho determinato che il motivo del crash è che sia il bambino attuale che quello nuovo hanno perso il genitore tra le pressioni dei pulsanti. Non ho idea del perché. Codice relevent per il genitore segue: codice
Interfaccia: codice
#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;
Implementazione:
- (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 risultati per il tasto 1, quindi il tasto 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:]'
Grazie per la pubblicazione. Sto anche lavorando al mio primo e ho avuto lo stesso problema :) –