Barks
Barks

Reputation: 151

Tab Bar appearing with no items

I worked CoreData into my Tab Bar app and the CoreData functions are working (i.e. I can output information from it to the console). The problem is that my tab bar isn't working. When I run my app, it looks like this:

enter image description here

It looks as if the tab bar itself is showing up but there aren't any items and it isn't displaying the table view. My storyboard looks like this:

enter image description here

Here is the code for my AppDelegate:

AppDelegate.h

#import <UIKit/UIKit.h>

#import "JobsViewController.h"
#import "Job.h"
#import "Shift.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

@end

AppDelegate.m

#import "AppDelegate.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize managedObjectContext = __managedObjectContext;
@synthesize managedObjectModel = __managedObjectModel;
@synthesize persistentStoreCoordinator = __persistentStoreCoordinator;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{    
    NSManagedObjectContext *context = [self managedObjectContext];
    Job *job = [NSEntityDescription insertNewObjectForEntityForName:@"Job" inManagedObjectContext:context];
    job.employer = @"Calder Centre";
    job.jobTitle = @"Addictions Counsellor";
    job.regularRate = 25.9f;
    job.overtimeRate = 30.5f;
    job.deduction1 = 0.1f;
    job.deduction2 = 0.2f;
    job.deduction3 = 0.3f;
    job.deduction4 = 0.4f;
    job.deduction1Name = @"CPP";
    job.deduction2Name = @"IT";
    job.deduction3Name = @"Union Dues";
    job.deduction4Name = @"Other";

    Shift *shift = [NSEntityDescription insertNewObjectForEntityForName:@"Shift" inManagedObjectContext:context];
    shift.startDate = [NSDate date];
    shift.endDate = [NSDate date];

    NSError *error;
    if (![context save:&error]) {
        NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
    }

    // Test listing all FailedBankInfos from the store
    NSFetchRequest *jobFetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *jobEntity = [NSEntityDescription entityForName:@"Job" inManagedObjectContext:context];
    [jobFetchRequest setEntity:jobEntity];
    NSArray *fetchedJobs = [context executeFetchRequest:jobFetchRequest error:&error];
    for (Job *job in fetchedJobs) {
        NSLog(@"Employer: %@", job.employer);
        NSLog(@"Title: %@", job.jobTitle);
    }

    NSFetchRequest *shiftFetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *shiftEntity = [NSEntityDescription entityForName:@"Shift" inManagedObjectContext:context];
    [shiftFetchRequest setEntity:shiftEntity];
    NSArray *fetchedShifts = [context executeFetchRequest:shiftFetchRequest error:&error];
    for (Shift *shift in fetchedShifts) {
        NSLog(@"Start Date: %@", shift.startDate);
        NSLog(@"End Date: %@", shift.endDate);
    }

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.

    UITabBarController *tabBarController = [[UITabBarController alloc]init];
    self.window.rootViewController = tabBarController;

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    return YES;
}

Here is the view controller:

JobsViewController.h

#import <UIKit/UIKit.h>
#import "Job.h"
#import "Shift.h"

@interface JobsViewController : UITableViewController

@property (nonatomic, strong) NSManagedObjectContext* managedObjectContext;
@property (nonatomic, strong) NSArray *listOfJobs;

@end

JobsViewController.m

#import "JobsViewController.h"

@interface JobsViewController ()

@end

@implementation JobsViewController

@synthesize managedObjectContext, listOfJobs;

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    self.navigationItem.rightBarButtonItem = self.editButtonItem;

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription 
                                   entityForName:@"Job" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];
    NSError *error;
    self.listOfJobs = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    self.title = @"Jobs";
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [listOfJobs count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"job";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    Job *job = [listOfJobs objectAtIndex:indexPath.row];
    cell.textLabel.text = job.jobTitle;
    cell.detailTextLabel.text = job.employer;

    return cell;
}

Upvotes: 0

Views: 170

Answers (1)

jrturton
jrturton

Reputation: 119242

This has nothing to do with core data.

You are using code from an app delegate template for a non-storyboard project, but you are using a storyboard. The code in your didFinishLaunching method is creating a new window and empty tab bar controller, which is overriding anything from your storyboard.

Get rid of everything after self.window =, except return YES;. This is code used in xib-based applications and is not necessary if you have a storyboard.

Upvotes: 1

Related Questions