daydreamer
daydreamer

Reputation: 91969

UINavigationController not appearing?

I have a Add View where when you tap on Category, the following code is executed

- (void)categoryTapped {
    CategoryGroupViewController *categoryGroupViewController = [[CategoryGroupViewController alloc] initWithNibName:@"CategoryGroupViewController" bundle:nil];
    [self presentViewController:categoryGroupViewController animated:YES completion:nil];
}

CategoryGroupViewController.h looks like

@interface CategoryGroupViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) UINavigationController *navigationController;
@property (strong, nonatomic) IBOutlet UITableView *tableView;
@end

CategoryGroupViewController.m looks like

#import "CategoryGroupViewController.h"
#import "Helper.h"

static NSString *CellIdentifier = @"Cell";

@interface CategoryGroupViewController ()
@property(nonatomic, strong) NSArray *categories;
@end

@implementation CategoryGroupViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // (todo) should come from API
        self.categories = @[@"Food & Drink", @"Utilities"];
    }
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:CellIdentifier];
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    NSLog(@"categoryGroup View loaded");
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:self];
    self.navigationController.title = @"Pick Category";
}
...
}

When I run my application, I see the following in log

2014-11-20 21:29:53.589 myapp-ios[30332:70b] categoryGroup View loaded

But on Simulator, I see
enter image description here

Why don't I see NavigationController?

Upvotes: 1

Views: 956

Answers (4)

Shankar BS
Shankar BS

Reputation: 8402

as i mentioned above if u want a navigaioncontroller u can set CategoryGroupViewController as a root view for a navigation controller and present it for example,

- (void)categoryTapped
{
    CategoryGroupViewController *categoryGroupViewController = [[CategoryGroupViewController alloc] initWithNibName:@"CategoryGroupViewController"  bundle:nil];
    //add this        
   UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController: categoryGroupViewController]; 
   //present the navigation controller which contains root view controller categoryGroupViewController 
   [self presentViewController:navController animated:YES completion:nil];
}

Upvotes: 1

A. R. Younce
A. R. Younce

Reputation: 1923

UIViewController already as a navigationController property, so this is redundant:

// Remove this property from CategoryGroupViewController
@property (nonatomic, strong) UINavigationController *navigationController;

Structuring the user interface in the way you are attempting is also incorrect, and would result in a circular reference between CategoryGroupViewController and UINavigationController. First you need to modify your -viewDidLoad method like so:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    NSLog(@"categoryGroup View loaded");

    // UINavigationController will use this automatically. 
    self.title = @"Pick Category";    
}

Then you should change the way you go about preseting the view controller in your original method:

- (void)categoryTapped {
    CategoryGroupViewController *categoryGroupViewController = [[CategoryGroupViewController alloc] initWithNibName:@"CategoryGroupViewController" bundle:nil];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:categoryGroupViewController];
    [self presentViewController:navController animated:YES completion:nil];
}

Finally, the introduction in the UINavigationController documentation has a great explanation of how the class should be used. Taking a few minutes to read it would help you tremendously in the future.

Upvotes: 0

Yuvrajsinh
Yuvrajsinh

Reputation: 4584

As you are presenting your CategoryGroupViewController it will not show Navigation Bar by default.

You have to set your CategoryGroupViewController as rootViewController for UINavigationController and instead of presenting CategoryGroupViewController present newly created UINavigationController.

- (void)categoryTapped{
    CategoryGroupViewController *categoryGroupVC = [[CategoryGroupViewController alloc] initWithNibName:@"CategoryGroupViewController"  bundle:nil];      
   UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController: categoryGroupVC]; 
   [self presentViewController:categoryGroupViewController animated:YES completion:nil];
}

Upvotes: 2

Related Questions