Unable to pushViewController for subview

2019-02-10 18:45发布

I have a UINavigationController and I have seperate UIViews that I switch between using a UISegmentControl. On switching the views, I add the view as a subview to my navigation controller's view:

[self.view addSubview:segmentTab1.view];

and

[self.view addSubview:segmentTab2.view];

Then, in the subViews, each has a UITableView, but my issue is, that I am unable to push a new viewController into view in the didSelectRowAtIndexPath method.

The method is called correctly and by setting breakpoints, I can see the method for pushing the view gets called as well, but nothing happens. This is my code for pushing it:

[self.navigationController pushViewController:detailsViewController animated:YES];

I also tried

[super.navigationController pushViewController:detailsViewController animated:YES];

What am I doing wrong - or is is just not possible to do it with a subview?

6条回答
萌系小妹纸
2楼-- · 2019-02-10 19:29

I had a similar issue when implementing a common header for all the views After many tries , i have fixed it by this -

In all the viewController

- (void)viewWillAppear:(BOOL)animated {

    [self.view addSubview:[[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] view]];
    [[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] viewWillAppear:YES];

}

I have referred following post to implement the header view Common XIB in multiple View Controller in iPhone

[self.view addSubview:[[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] view]];     // line will load the header subview 

[[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] viewWillAppear:YES]; // this is to call the viewWillAppear method of HeaderController where we can write code to check the user is logged or not and change the login button to logout button etc ..

查看更多
做自己的国王
3楼-- · 2019-02-10 19:29

It is not entirely clear to me what your view hierarchy is, but in general if your navigation controllers view is not the first subview of a window or an element of one of Apple's collection views (either another navigation view controller's content view or a tab controller's content view) it won't work correctly.

查看更多
兄弟一词,经得起流年.
4楼-- · 2019-02-10 19:35
LogEntryDetailViewController *leController = [[LogEntryDetailViewController alloc] initWithNibName:@"LogEntryDetailView" bundle:[NSBundle mainBundle]];
    [leController setTitle:[NSString stringWithFormat:@"%@", [logEntriesArray objectAtIndex:row]]];
    [[self navigationController] pushViewController:leController animated:NO];      
    [leController release], leController = nil;
查看更多
姐就是有狂的资本
5楼-- · 2019-02-10 19:36

When you call -pushViewController, which view controller is self? If you are calling that from within one of your tab subviews, self likely doesn't have a reference to the navigation controller from the top level view that you added it to. You can verify this by getting the memory address of the navigation controller from within the top level view and comparing it to what you have in the subview. Obviously if it's nil or doesn't match, then that's your problem.

You only get a navigation controller "for free" when it's been added to the navigation stack itself with -pushViewController which your subviews haven't been added that way.

查看更多
ら.Afraid
6楼-- · 2019-02-10 19:38

One possibility, if you are not averse to singletons, is to make your product's UINavigationController object be a singleton, accessible from (for example) your application delegate.

You would invoke it thus:

[[((MyApplicationDelegate*)[UIApplication delegate]) navController] 
                pushViewController: viewControllerToPush animated: YES];

where within MyApplicationDelegate, navController returns the singleton object.

查看更多
劳资没心,怎么记你
7楼-- · 2019-02-10 19:43

Instead of

[self.view addSubview:segmentTab1.view];

and

[self.view addSubview:segmentTab2.view];

you may use

[self pushViewController: segmentTab1 animated: NO];

and

[self pushViewController: segmentTab2 animated: NO];

to add your viewControllers to the navigation hierarchy, and make [super.navigationController pushViewController:detailsViewController animated:YES]; work.

查看更多
登录 后发表回答