0

I have built a UIViewController to contain two other UIViewControllers. What I would like to do using a UISegment in the UINavigationBar is to switch between both views. When the user is finished they click on "Done" and it goes back to the RootViewController. I got this to work except the UIViewControllers take the size of the whole screen so the top portion is covered by the UINavigationBar. They don't adjust to the space under the UINavigationBar. I have been trying different techniques without success.

I have already tried in the ChildUIViewControllers without success

self.edgesForExtendedLayout = UIRectEdgeNone;

Here is my code:

RootViewController Calls the Container

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

Anybody know what the problem is? Thanks.

d264789
  • 31
  • 5

1 Answers1

0

I found a solution. The reason that the tableview was under the navigationbar was due to the translucence of the navigation bar. When I set this:

self.navigationController.navigationBar.translucent = NO;

The views remained under the navigation bar. There was still a black bar above the UITableView I fixed that problem by instead of using a UITableViewController I user a UIViewController and added a tableView. Here is some code to make cycle between the two views in the container 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;
    }
}

}

d264789
  • 31
  • 5