简体   繁体   中英

Navigation Controller in a Tab Controller not showing back button

I have a tab controller with 2 tabs "My information" and "their Information", which is just a bunch of text boxes. I want a Navigation controller at the top so I can go back, but the back button won't show up... here is my code:

Button pressed to show Form:

-(IBAction)onIncidentAidFormPressed:(id)sender {
    FormController *aidForm = [[FormController alloc] initWithNibName:@"formController" bundle:nil];
    aidForm.managedObjectContext = self.managedObjectContext;
    [self.navigationController pushViewController:aidForm animated:YES];
}

In FormController.m - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil:

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    self.title = NSLocalizedString(@"Aid Form", @"Aid Form title");
}
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UIViewController *viewController1 = [[MyInformationController alloc] initWithNibName:@"MyInformationController" bundle:nil];
UIViewController *viewController2 = [[TheirInformationController alloc] initWithNibName:@"TheirInformationController" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithNibName:@"navController" bundle:nil];

[navController pushViewController:viewController1 animated:YES];

self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = [NSArray arrayWithObjects:navController, viewController2, nil];
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
return self;

The tabs show up correctly, and the navigation bar is there but no back button is shown to get back.

Edit: Here are the files: IncidentAidStartViewController.h

#import <UIKit/UIKit.h>

@interface IncidentAidStartViewController : UIViewController {
    IBOutlet UIButton *incidentAidForm;
    IBOutlet UIButton *emergencyContacts;
}

-(IBAction)onIncidentAidFormPressed:(id)sender;
@property (strong, nonatomic) IncidentAidStartViewController *detailViewController;

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@end

IncidentAidStartViewController.m

#import "IncidentAidStartViewController.h"
#import "IncidentAidForm.h"
@implementation IncidentAidStartViewController

@synthesize detailViewController = _detailViewController;
@synthesize managedObjectContext = __managedObjectContext;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = NSLocalizedString(@"Incident Aid", @"Incident Aid title");
    }
    return self;
}

#pragma mark - Button handlers
-(IBAction)onIncidentAidFormPressed:(id)sender { 
    IncidentAidForm *aidForm = [[IncidentAidForm alloc] initWithNibName:@"IncidentAidForm" bundle:nil]; 
    aidForm.managedObjectContext = self.managedObjectContext; 
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:nil]; 
    [self.navigationController pushViewController:aidForm animated:YES];

}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

IncidentAidForm.h

#import <UIKit/UIKit.h>

@interface IncidentAidForm : UIViewController <UITabBarControllerDelegate> {

}

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) UITabBarController *tabBarController;

@property (strong, nonatomic) IncidentAidForm *detailViewController;

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@end

IncidentAidForm.m

#import "IncidentAidForm.h"
#import "MyInformationController.h"
#import "TheirInformationController.h"

@implementation IncidentAidForm

@synthesize detailViewController = _detailViewController;
@synthesize managedObjectContext = __managedObjectContext;
@synthesize window = _window;
@synthesize tabBarController = _tabBarController;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = NSLocalizedString(@"Incident Aid Form", @"Incident Aid Form title");
    }
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    UIViewController *viewController1 = [[MyInformationController alloc] initWithNibName:@"MyInformationController" bundle:nil];
    UIViewController *viewController2 = [[TheirInformationController alloc] initWithNibName:@"TheirInformationController" bundle:nil];
    UINavigationController *navController1 = [[UINavigationController alloc] initWithRootViewController:viewController1];
    UINavigationController *navController2 = [[UINavigationController alloc] initWithRootViewController:viewController2];

    self.tabBarController = [[UITabBarController alloc] init];
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:navController1, navController2, nil];

    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];

    return self;
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];    
    // Do any additional setup after loading the view from its nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

MyInformationController.h

#import <UIKit/UIKit.h>

@interface MyInformationController : UIViewController {

    IBOutlet UIScrollView *scrollView;
    IBOutlet UITextField *firstName;
    IBOutlet UITextField *lastName;
    IBOutlet UITextField *phoneNumber;
    IBOutlet UITextField *address;
    IBOutlet UITextField *carMake;
    IBOutlet UITextField *carModel;
    IBOutlet UITextField *carYear;
    IBOutlet UITextField *licensePlate;
    IBOutlet UITextField *insuranceCarrier;
    IBOutlet UITextField *insurancePolicy;
    IBOutlet UIButton *backgroundButton;

}

@property(nonatomic, retain) UIScrollView *scrollView;
@property (nonatomic, retain) IBOutlet UITextField *firstName;
@property (nonatomic, retain) IBOutlet UITextField *lastName;
@property (nonatomic, retain) IBOutlet UITextField *phoneNumber;
@property (nonatomic, retain) IBOutlet UITextField *address;
@property (nonatomic, retain) IBOutlet UITextField *carMake;
@property (nonatomic, retain) IBOutlet UITextField *carModel;
@property (nonatomic, retain) IBOutlet UITextField *carYear;
@property (nonatomic, retain) IBOutlet UITextField *licensePlate;
@property (nonatomic, retain) IBOutlet UITextField *insuranceCarrier;
@property (nonatomic, retain) IBOutlet UITextField *insurancePolicy;

- (void) animateTextField: (UITextField*) textField up: (BOOL) up;
-(IBAction)hideKeyboard;
@end

MyInformationController.m

#import "MyInformationController.h"

@implementation MyInformationController

@synthesize scrollView, firstName, lastName, phoneNumber, address, carMake, carModel, carYear, licensePlate, 
insuranceCarrier, insurancePolicy;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = NSLocalizedString(@"My Information", @"My Information");
        self.tabBarItem.image = [UIImage imageNamed:@"first"];

    }
    return self;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationItem.leftBarButtonItem = self.navigationItem.backBarButtonItem;

    // Do any additional setup after loading the view, typically from a nib.
    firstName.delegate = self;
    lastName.delegate = self;
    phoneNumber.delegate = self;
    address.delegate = self;
    carMake.delegate = self;
    carModel.delegate = self;
    carYear.delegate = self;
    licensePlate.delegate = self;
    insuranceCarrier.delegate = self;
    insurancePolicy.delegate = self;

    [scrollView setContentSize:self.view.frame.size];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    //[self animateTextField: textField up: YES];
    scrollView.frame = CGRectMake(0,44,320,200); //44:NavigationBar ; 200: Keyoard
    [scrollView scrollRectToVisible:textField.frame animated:YES];
}


- (void)textFieldDidEndEditing:(UITextField *)textField
{
    //[self animateTextField: textField up: NO];
    if (textField.tag == 10) {
        scrollView.frame = CGRectMake(0,44,320,416); //original setup
        // [textField resignFirstResponder];
    }
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    switch (textField.tag) {
        case 1:
            [lastName becomeFirstResponder];
            break;
        case 2:
            [phoneNumber becomeFirstResponder];
            break;
        case 3:
            [address becomeFirstResponder];
            break;
        case 4:
            [carMake becomeFirstResponder];
            break;
        case 5:
            [carModel becomeFirstResponder];
            break;
        case 6:
            [carYear becomeFirstResponder];
            break;
        case 7:
            [licensePlate becomeFirstResponder];
            break;
        case 8:
            [insuranceCarrier becomeFirstResponder];
            break;
        case 9:
            [insurancePolicy becomeFirstResponder];            
            break;
        case 10:
            [textField resignFirstResponder];
            break;
        default:
            break;
    }

    return TRUE;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (IBAction)hideKeyboard {
    [self.firstName resignFirstResponder];
    [self.lastName resignFirstResponder];
    [self.phoneNumber resignFirstResponder];
    [self.address resignFirstResponder];
    [self.carMake resignFirstResponder];
    [self.carModel resignFirstResponder];
    [self.carYear resignFirstResponder];
    [self.licensePlate resignFirstResponder];
    [self.insurancePolicy resignFirstResponder];
    [self.insuranceCarrier resignFirstResponder];
    scrollView.frame = CGRectMake(0,44,320,416); //original setup

}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];    
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end

So far I know this is a good way to add ur views to tabbar. So try this

UIViewController *viewController1 = [[MyInformationController alloc] initWithNibName:@"MyInformationController" bundle:nil];
UIViewController *viewController2 = [[TheirInformationController alloc] initWithNibName:@"TheirInformationController" bundle:nil];
UINavigationController *navController1 = [[UINavigationController alloc] initWithRootViewController:viewController1];
UINavigationController *navController2 = [[UINavigationController alloc] initWithRootViewController:viewController2];

self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = [NSArray arrayWithObjects:navController1, navController2, nil];

To add back bar item , below ine is also used.

self.navigationItem.leftBarButtonItem = self.navigationItem.backBarButtonItem;

Please modify your method like this

-(IBAction)onIncidentAidFormPressed:(id)sender
 {
    FormController *aidForm = [[FormController alloc] initWithNibName:@"formController" bundle:nil];
    aidForm.managedObjectContext = self.managedObjectContext;
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:nil];
    [self.navigationController pushViewController:aidForm animated:YES];

}

you should replace your code with the following:

UIViewController *viewController1 = [[MyInformationController alloc] initWithNibName:@"MyInformationController" bundle:nil];
UIViewController *viewController2 = [[TheirInformationController alloc] initWithNibName:@"TheirInformationController" bundle:nil];
UINavigationController *navController1 = [[[UINavigationController alloc] initWithRootViewController:viewController1] autorelease];
UINavigationController *navController2 = [[[UINavigationController alloc] initWithRootViewController:viewController2] autorelease];

self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = [NSArray arrayWithObjects:navController1, navController2, nil];

let me know any thing else you need........

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM