0

我正在创建一个应用程序,它使用位于 的(UINavigationController视图的 nib 是 RootViewController.xib)MainWindow.xibUITableView. RootViewController.xib我有这个代码:

MainWindow.xib 的UINavigationController

抱歉,您需要能够看到这张图片 http://img42.imageshack.us/img42/9338/schermafbeelding2010021.png

TDAppDelegate.h

@interface TDAppDelegate : NSObject <UIApplicationDelegate> {
    // VARIABLES
    NSManagedObjectModel *managedObjectModel;
    NSManagedObjectContext *managedObjectContext;       
    NSPersistentStoreCoordinator *persistentStoreCoordinator;

    // IBOUTLETS
    UIWindow *window;
    UINavigationController *navigationController;
}

// PROPERTIES
@property(nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property(nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property(nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

@property(nonatomic, retain) IBOutlet UIWindow *window;
@property(nonatomic, retain) IBOutlet UINavigationController *navigationController;


// IBACTIONS


// METHODS
- (NSString *)applicationDocumentsDirectory;

@end

TDAppDelegate.m

#import "TDAppDelegate.h"


@implementation TDAppDelegate

@synthesize window;
@synthesize navigationController;

// MEMORY
- (void)dealloc {
    [managedObjectContext release];
    [managedObjectModel release];
    [persistentStoreCoordinator release];

    [navigationController release];
    [window release];
    [super dealloc];
}

// APPLICATION

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    [window makeKeyAndVisible];
    [window addSubview:[navigationController view]]; // IT GOES WRONG WHEN I DO THIS
}

- (void)applicationWillTerminate:(UIApplication *)application {
    // Save changes before quitting =D
    NSError *error = nil;
    if(managedObjectContext != nil) {
        if([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        } 
    }
}

// CORE DATA
- (NSManagedObjectContext *) managedObjectContext {
    // Returns the managed object context for the application. If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
    if(managedObjectContext != nil) {
        return managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if(coordinator != nil) {
        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator: coordinator];
    }
    return managedObjectContext;
}

- (NSManagedObjectModel *)managedObjectModel {
    // Returns the managed object model for the application. If the model doesn't already exist, it is created by merging all of the models found in the application bundle.
    if(managedObjectModel != nil) {
        return managedObjectModel;
    }
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    
    return managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    // Returns the persistent store coordinator for the application. If the coordinator doesn't already exist, it is created and the application's store added to it.
    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"To_Do.sqlite"]];

    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        UIAlertView *quitAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"error", @"error")  message:[NSString stringWithFormat:NSLocalizedString(@"persistentstorecoordinator error", @""), [error userInfo]] delegate:nil cancelButtonTitle:nil otherButtonTitles:nil];
        [quitAlert show];
        [quitAlert release];
    }    

    return persistentStoreCoordinator;
}


- (NSString *)applicationDocumentsDirectory {
    // Returns the path to the application's Documents directory.
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

@end

TDRootViewController.h

#import <UIKit/UIKit.h>


@interface TDRootViewController : UITableViewController <UITableViewDataSource> {
    NSMutableArray *todoArray;
    NSManagedObjectContext *managedObjectContext;

    UIBarButtonItem *addButton;
}

@property(nonatomic, retain) NSMutableArray *todoArray;
@property(nonatomic, retain) NSManagedObjectContext *managedObjectContext;

@property(nonatomic, retain) UIBarButtonItem *addButton;

@end

TDRootViewController.m

#import "TDRootViewController.h"
#import "TodoItem.h"


@implementation TDRootViewController

// MEMORY
- (void)dealloc {
    [super dealloc];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
}

// VIEW
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
        return YES;
    }
    return NO;
}

// TABLE VIEW

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 1;
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Set up the cell...

    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Navigation logic may go here. Create and push another view controller.
    // AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil];
    // [self.navigationController pushViewController:anotherViewController];
    // [anotherViewController release];
}


/*
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the specified item to be editable.
    return YES;
}
 */


/*
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }   
}
*/


/*
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
}
*/


/*
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the item to be re-orderable.
    return YES;
}
*/

// METHODS
- (void)addItem {
    TodoItem *todoItem = (TodoItem *)[NSEntityDescription insertNewObjectForEntityForName:@"TodoItem" inManagedObjectContext:managedObjectContext];
}

@end

呼=D

好的,我的应用程序编译正确,但是当它启动时,神圣的控制台会这样说:

[Session started at 2010-02-14 14:40:12 +0100.]
2010-02-14 14:40:15.245 To Do[1478:207] *** -[UIViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x3a155b0
2010-02-14 14:40:15.246 To Do[1478:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UIViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x3a155b0'
2010-02-14 14:40:15.246 To Do[1478:207] Stack: (
    30893147,
    2500113673,
    31275067,
    30844534,
    30697154,
    4364410,
    4371786,
    4370783,
    3087322,
    3027833,
    3069268,
    3057823,
    57406128,
    57405551,
    57403590,
    57402682,
    2731769,
    2755464,
    2737875,
    2764981,
    38989521,
    30677888,
    30673992,
    2731625,
    2768899,
    10592,
    10446
)

我认为这有关系,numberOfRowsInSection但我不确定。谁能帮我吗?谢谢

4

2 回答 2

1

我相信您已将有问题的 UITableView(在 Interface Builder 中)的数据源连接连接到错误的源。
它应该连接到文件的所有者。

或者文件所有者的类没有设置为正确的视图控制器。

从您的 IB 发布一些屏幕截图。
发布下一个屏幕:
- 选择表格视图并按 Cmd+2
- 选择文件的所有者并按 Cmd+4

于 2010-02-14T14:51:57.177 回答
0

你是对的,它确实与-tableView:numberOfRowsInSection:方法有关,这就是错误特别提到该方法的原因。

该方法是表视图的数据源方法之一。“无法识别的选择器”消息意味着表视图正在尝试在未实现它的对象上调用此方法。由于您在 TDRootViewController 中实现了该方法,因此您必须将数据源连接到其他东西。

我认为我们没有足够的信息来说明它在哪里连接,但它显然连接错误。在 IB 中查找,找到此连接,然后查看它通向何处。然后修复它,使其指向正确的位置,这似乎是您的 TDRootViewController 实例。

于 2010-02-15T00:44:32.493 回答