it-swarm.com.de

Fügen Sie die Ansicht eines untergeordneten Ansichtscontrollers zu einer Unteransicht des übergeordneten Ansichtscontrollers hinzu

Ich möchte einen tableViewController als untergeordneten View-Controller eines containerViewControllers hinzufügen (siehe unten). Laut Apples View Controller Programming Guide kann ich dies durch die folgenden Codezeilen in meinem containerViewController erreichen:

   [self addChildViewController:tableViewController];
   [self.view addSubview:tableViewController.view];
   [tableViewController didMoveToParentViewController:self];

In der Tat funktioniert das gut. Das Problem ist nun, dass ich die tableViewController-Ansicht nicht als Unteransicht der Stammansicht des containerViewController hinzufügen möchte. Stattdessen möchte ich es als Unteransicht der containerView (siehe Bild) hinzufügen, die selbst eine Unteransicht der Stammansicht des containerViewController ist. Also habe ich den obigen Code wie folgt geändert:

   [self addChildViewController:tableViewController];
   [self.contentView addSubview:tableViewController.view];
   [tableViewController didMoveToParentViewController:self];

Wenn ich die App starte, stürzt sie sofort mit folgendem Fehler ab:

Beenden der App aufgrund einer nicht erfassten Ausnahme 'UIViewControllerHierarchyInconsistency', Grund: 'untergeordneter Ansichtscontroller: sollte übergeordneten Ansichtscontroller haben, der tatsächliche übergeordnete Ansichtscontroller ist jedoch:'

Was ist das Problem hier? Ist es nicht möglich, die Ansicht eines childViewControllers einer bestimmten sub Ansicht seines containerViewControllers hinzuzufügen? Oder wie kann ich das ohne Fehler in der View-Controller-Hierarchie erreichen?

containerViewController

28
Mischa

Es spielt keine Rolle, zu welcher Ansicht Sie den untergeordneten viewController hinzufügen. Wenn eine Ansicht eines viewControllers zu einem anderen viewController hinzugefügt wird, müssen Sie sie ordnungsgemäß festlegen.

tableViewController.view.frame = self.contentView.bounds;
[self.contentView addSubview:tableViewController.view];
/*Calling the addChildViewController: method also calls 
the child’s willMoveToParentViewController: method automatically */
[self addChildViewController:tableViewController];
[tableViewController didMoveToParentViewController:self];

Quellcode

48
Anupdas

Um einen child_view_controller über einen main_view_controller anzuzeigen.

Schritt 1: erstelle einen main_view_controller im storyboard.

Schritt 2: Erstelle einen child_view_controller mit einem UIview und einem Label darin im Storyboard.

Schritt 3: Fügen Sie in der Tastenaktion von main_view_controller den folgenden Code hinzu:

- (IBAction)YourButtonAction:(id)sender {
    ChildViewControllerName *childViewControllerName = [self.storyboard instantiateViewControllerWithIdentifier:@"storyboardIdYouProvided"];
    childViewControllerName.view.frame = CGRectMake(self.view.frame.Origin.x, self.view.frame.Origin.y, self.view.frame.size.width, self.view.frame.size.height);
    [self.view addSubview:childViewControllerName.view];
    [childViewControllerName didMoveToParentViewController:self];
}
1
Ram Madhavan
//class name InfoViewController

IBOutlet UIView *addViewToAddPlot;
InfoViewController *InfoController;

-(void) add_method
{
    InfoController = [[InfoViewController alloc] initWithNibName:@"InfoViewController" bundle:nil];
    InfoController.view.frame = self.addViewToAddPlot.bounds;

    [self containerAddChildViewController:InfoController];
}

-(void) remove_method
{
    [self containerRemoveChildViewController : InfoController];
}

- (void)containerAddChildViewController:(UIViewController *)childViewController {

    [self addChildViewController:childViewController];
    [self.addViewToAddPlot addSubview:childViewController.view];
    [childViewController didMoveToParentViewController:self];

}

- (void)containerRemoveChildViewController:(UIViewController *)childViewController {

    [childViewController willMoveToParentViewController:nil];
    [childViewController.view removeFromSuperview];
    [childViewController removeFromParentViewController];

}

Hinzufügen und Entfernen von viewcontroller, # childviewcontroller

1
Manjeet