Connect initial view controller to tab view controller

156 views Asked by At

I want to use a login scene as the initial view controller and to connect it to a tab view controller. I keep receiving the following error message:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController tabBar]: unrecognized selector sent to instance 0x7fe85a560fd0'

//  LogInViewController.h
#import <UIKit/UIKit.h>

@interface LogInViewController : UIViewController <UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *txtUsername;
@property (weak, nonatomic) IBOutlet UITextField *txtPassword;

- (IBAction)sigininClicked:(id)sender;

- (IBAction)backgroundTap:(id)sender;
@end


//  AppDelegate.m
// 

#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application     didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

// Assign tab bar item with titles
UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
UITabBar *tabBar = tabBarController.tabBar;
UITabBarItem *tabBarItem1 = [tabBar.items objectAtIndex:0];
UITabBarItem *tabBarItem2 = [tabBar.items objectAtIndex:1];
UITabBarItem *tabBarItem3 = [tabBar.items objectAtIndex:2];
UITabBarItem *tabBarItem4 = [tabBar.items objectAtIndex:3];

tabBarItem1.title = @"Trucks";
tabBarItem2.title = @"Dashboard";
tabBarItem3.title = @"Map";
tabBarItem4.title = @"Settings";

[tabBarItem1 setFinishedSelectedImage:[UIImage imageNamed:@"iu.png"]
          withFinishedUnselectedImage:[UIImage imageNamed:@"iu.png"]];
[tabBarItem2 setFinishedSelectedImage:[UIImage imageNamed:@"dashboard.png"]
          withFinishedUnselectedImage:[UIImage imageNamed:@"dashboard.png"]];
[tabBarItem3 setFinishedSelectedImage:[UIImage imageNamed:@"globe.png"]
          withFinishedUnselectedImage:[UIImage imageNamed:@"globe.png"]];
[tabBarItem4 setFinishedSelectedImage:[UIImage imageNamed:@"settings.png"]
          withFinishedUnselectedImage:[UIImage imageNamed:@"settings.png"]];

return YES;
}
1

There are 1 answers

2
ABC On BEST ANSWER

I'm not an expert at ios, but here is how I did it programmatically recently (without storyboards) in my app. This is the code extracted from my appdelegate but it should work for your purpose as well.

In the .h file:

@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate>
      @property (strong, nonatomic) UITabBarController *tabBarController;
      @property (strong, nonatomic) UIWindow *window;

In the .m file:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
    self.tabBarController = [[UITabBarController alloc] init];
    FirstViewController *firstvc = [[FirstViewController alloc] init];
    SecondViewController *secondvc = [[SecondViewController alloc] init];
    tabBarController.viewControllers = @[firstvc, secondvc];
    self.window.rootViewController = tabBarController;
}

EDIT:

Within my FirstViewController and SecondViewController .m files:

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self= [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if(self){
         self.tabBarItem.image = [UIImage imageNamed:@"img_vc1"];
         self.tabBarItem.title = @"My 1st View";
    }
    return self;
}

Hope this helps.