2013-07-25 16 views
7
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    ChildViewController *childviewcontroller = [[ChildViewController alloc] initWithNibName:@"ChildViewController" bundle:nil]; 


    [self addChildViewController:childviewcontroller]; 
    [self.view addSubview:childviewcontroller.view]; 
    [childviewcontroller willMoveToParentViewController:self]; 
    UIView *cview = [[UIView alloc] init]; 
    cview = childviewcontroller.view; 
    [self.view removeConstraints:self.view.constraints]; 

    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(cview); 
    [self.view addConstraints:[NSLayoutConstraint 
           constraintsWithVisualFormat:@"H:|-[cview]-|" 
                options:0 metrics:nil           
                views:viewsDictionary]]; 

} 

Chcę dodać widok podglądu childviewcontroller nad widokiem rodzica. Po dodaniu ustawiam ograniczenie, ale nie działa ono dla mnie.Jak dodać widok kontrolera widoku podrzędnego do nadrzędnego widoku

Jestem również coraz ostrzeżenia takie jak ta

2013-07-25 10:47:30.564 neenah[1105:c07] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: (1) look at each constraint and try to figure out which you don't expect; 
    (2) find the code that added the unwanted constraint or constraints and fix it. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't 
    understand, refer to the documentation for the UIView 
    property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x9256c90 H:|-(NSSpace(20))-[UIView:0x9256a00] (Names: '|':UIView:0x92557a0)>", 
    "<NSAutoresizingMaskLayoutConstraint:0x755d690 h=--& v=--& H:[UIView:0x9256a00(320)]>", 
    "<NSAutoresizingMaskLayoutConstraint:0x755d5a0 h=--& v=--& UIView:0x9256a00.midX == + 160>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x9256c90 H:|-(NSSpace(20))-[UIView:0x9256a00] (Names: '|':UIView:0x92557a0)> 

Break on objc_exception_throw to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 
2013-07-25 10:47:30.567 neenah[1105:c07] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x9256bb0 H:[UIView:0x9256a00]-(NSSpace(20))-| (Names: '|':UIView:0x92557a0)>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7561690 h=--- v=--- H:[UIWindow:0x92527c0(320)]>", 
    "<NSAutoresizingMaskLayoutConstraint:0x755fe50 h=-&- v=-&- UIView:0x92557a0.width == UIWindow:0x92527c0.width>", 
    "<NSAutoresizingMaskLayoutConstraint:0x755d690 h=--& v=--& H:[UIView:0x9256a00(320)]>", 
    "<NSAutoresizingMaskLayoutConstraint:0x755d5a0 h=--& v=--& UIView:0x9256a00.midX == + 160>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x9256bb0 H:[UIView:0x9256a00]-(NSSpace(20))-| (Names: '|':UIView:0x92557a0)> 

Break on objc_exception_throw to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 
+0

Trzeba tylko tę linię do tego [self.view addSubview: childviewcontroller.view]; –

+0

Zrobiłem to w mojej drugiej linii, moim problemem jest to, że moje ograniczenie nie działa tutaj. @Puneet –

+0

@DhiyanesKaeYes Jeśli zamierzasz użyć autolayout do tego, (a) brakuje Ci @ "V: | - [cview] - |" zestaw ograniczeń; i (b) prawdopodobnie chcesz "cview.translatesAutosizingMaskIntoConstraints = NO". – Rob

Odpowiedz

13

kilka uwag:

  1. Należy wyłączyć translatesAutoresizingMaskIntoConstraints:

    childviewcontroller.view.translatesAutoresizingMaskIntoConstraints = NO; 
    
  2. Należy określić pionowych ograniczeń, zbyt :

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[cview]-|" 
                        options:0 
                        metrics:nil           
                        views:viewsDictionary]]; 
    
  3. niezwiązane z problemu, nie trzeba stworzyć [[UIView alloc] init] dla cview. Natychmiast odrzucasz to.

  4. Nie jestem pewien, dlaczego usuwasz ograniczenia dla self.view. (Domyślam się, że to zrobiłeś, gdy wyłupałeś sobie włosy podczas testów.) Nie musisz tego robić. Ale jeśli masz coś innego, co sprawiło, że myślisz, że musisz to zrobić, daj nam znać, co to jest.

  5. Podczas dodawania kontrolera podrzędnego, dzwonisz pod numer didMoveToParentViewController, a nie willMoveToParentViewController. addChildViewController dzwoni do ciebie. Potrzebujesz tylko wersji didMove....

Zatem:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // instantiate the view controller 

    ChildViewController *childViewController = [[ChildViewController alloc] initWithNibName:@"ChildViewController" bundle:nil]; 

    // or you can instantiate using storyboard 
    // 
    // ChildViewController *child = [self.storyboard instantiateViewControllerWithIdentifier:@"ChildIdentifier"]; 

    // now do the view controller containment calls to update the view controller hierarchy and add the view as appropriate 

    [self addChildViewController:childViewController]; 
    childViewController.view.translatesAutoresizingMaskIntoConstraints = NO; 
    [self.view addSubview:childViewController.view]; 
    [childViewController didMoveToParentViewController:self]; 
    UIView *childView = childViewController.view; 

    NSDictionary *views = NSDictionaryOfVariableBindings(childView); 
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[childView]-|" options:0 metrics:nil views:views]]; 
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[childView]-|" options:0 metrics:nil views:views]]; 
} 
+1

dzięki za odpowiedź yur i teraz tylko uczę się tego pojęcia, dlatego mam kłopoty. @Rob –

+0

, który pracował dla mnie, gdy załadowałem kontroler widoku z plikiem nib, jak tutaj. ale kiedy pochodziło z storyboardu. instantiateViewControllerWithIdentifier to nie działa. kontener podrzędny nie reagował na ograniczenia ani widok macierzysty! – hasan83

+0

@ hasan83 - Gdy używasz 'instantiateViewControllerWithIdentifier', proces jest identyczny. Właśnie to przetestowałem i działa dobrze. Założę się, że masz pewne ograniczenia, które nie są poprawnie zdefiniowane.Jeśli nadal nie możesz znaleźć źródła problemu, opublikuj własne pytanie za pomocą [przykładu odtwarzalnego] (http://stackoverflow.com/help/mcve) problemu. – Rob

Powiązane problemy