0

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;
}
4

1 回答 1

1

这与核心数据无关。

您正在为非故事板项目使用来自应用程序委托模板的代码,但您正在使用故事板。您的 didFinishLaunching 方法中的代码正在创建一个新窗口和空选项卡栏控制器,它将覆盖您故事板中的任何内容。

摆脱之后的一切self.window =,除了return YES;。这是在基于 xib 的应用程序中使用的代码,如果您有情节提要,则不需要。

于 2012-05-09T05:57:06.453 回答