0

Я построил UIViewController, чтобы содержать два других UIViewControllers. То, что я хотел бы сделать, используя UISegment в UINavigationBar, - это переход между обоими представлениями. Когда пользователь будет завершен, нажмите «Готово», и он вернется к RootViewController. Я получил это для работы, за исключением того, что UIViewControllers берут размер всего экрана, поэтому верхняя часть покрывается UINavigationBar. Они не приспосабливаются к пространству под UINavigationBar. Я пробовал разные методы без успеха.Переключение между двумя UIViewControllers в NavigationBar под

Я уже пытался в ChildUIViewControllers без успеха

self.edgesForExtendedLayout = UIRectEdgeNone; 

Вот мой код:

RootViewController Вызывает контейнер

ContainerController *controller = [[ContainerController alloc] init] 
[self.navigationController pushViewController:controller animated:YES]; 

Container Code

- (void)viewDidLoad { 

[super viewDidLoad]; 
UIViewController *vc = [self getCurrentViewController]; // Returns Current ViewController to Display 
[self addChildViewController:vc]; 
vc.view.frame = self.view.bounds; 
[self.view addSubview:vc.view]; 

self.currentViewController = vc; 
} 

-(UIViewController *)getCurrentViewController{ 
UIViewController *vc; 
switch ([[NSUserDefaults standardUserDefaults] integerForKey:@"currentView"]) { 
    case kView1:{ 
     vc = (ViewController1 *)[[ViewController1 alloc] init]; 
    }break; 
    case kView2:{ 
     vc = (ViewController2 *)[[ViewController2 alloc] init]; 
    }break; 
} 
return vc; 
} 

- (void)segmentedControlIndexChanged:(id)sender{ 

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
[userDefaults setObject:[NSNumber numberWithInt:[sender selectedSegmentIndex]] forKey:@"currentView"]; 
[userDefaults synchronize]; 
UIViewController *vc = [self getCurrentViewController]; 

[self addChildViewController:vc]; 
[self transitionFromViewController:self.currentViewController toViewController:vc duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 
    [self.currentViewController.view removeFromSuperview]; 
    vc.view.frame = self.view.bounds; 
    [self.view addSubview:vc.view]; 
} completion:^(BOOL finished) { 
    [vc didMoveToParentViewController:self]; 
    [self.currentViewController removeFromParentViewController]; 
    self.currentViewController = vc; 
}]; 
self.navigationItem.title = vc.title; 
} 

Кто-нибудь знает, в чем проблема? Благодарю.

ответ

0

Я нашел решение. Причина, по которой табличное представление находилась под навигационной панелью, была связана с прозрачностью навигационной панели. Когда я установил это:

self.navigationController.navigationBar.translucent = NO; 

Виды остались под навигационной панелью. На UITableView я по-прежнему оставался черной полосой, я исправил эту проблему, вместо того, чтобы использовать UITableViewController I пользователь UIViewController и добавил tableView. Вот код, чтобы сделать цикл между двумя точками зрения в контейнере UIViewController:

- (void)viewDidLoad { 
self.viewController1 = [[ViewController1 alloc] init]; 
self.viewController2= [[ViewController2 alloc] init]; 

switch ([[NSUserDefaults standardUserDefaults] integerForKey:@"dataView"]) { 
case kDataView:{ 
    self.viewController1.view.hidden=YES; 
    self.viewController2.view.hidden=NO; 
}break; 
case kChartView:{ 
    self.viewController1.view.hidden=NO; 
    self.viewController2.view.hidden=YES; 
}break; 
} 

[self.view addSubview:self.viewController1.view]; 
[self.view addSubview:self.viewController2.view]; 
} 

- (void)segmentedControlIndexChanged:(id)sender{ 

    if ([[NSUserDefaults standardUserDefaults] integerForKey:@"dataView"]!=[sender selectedSegmentIndex]){ 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    [userDefaults setObject:[NSNumber numberWithInteger:[sender selectedSegmentIndex]] forKey:@"dataView"]; 
    [userDefaults synchronize]; 

    self.segmentedControl.selectedSegmentIndex=[[NSUserDefaults standardUserDefaults] integerForKey:@"dataView"]; 

    switch (self.segmentedControl.selectedSegmentIndex) { 
     case kDataView:{ 
      self.viewController1.view.hidden=YES; 
      self.viewController2.view.hidden=NO; 
     }break; 
     case kChartView:{ 
      self.viewController1.view.hidden=NO; 
      self.viewController2.view.hidden=YES; 
     }break; 
    } 
} 

}

Смежные вопросы