从.plist填充时TableView崩溃( - [NSCFString objectAtIndex:])

时间:2011-02-26 00:30:43

标签: iphone objective-c uitableview sdk

嘿伙计们, 我的应用程序在加载时崩溃,并在调试时将其抛出:

2011-02-26 00:24:33.254 LCPapers[5182:207] Set up the cell...
2011-02-26 00:24:33.255 LCPapers[5182:207] 0
2011-02-26 00:24:33.257 LCPapers[5182:207] -[NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x4b175f0
2011-02-26 00:24:33.261 LCPapers[5182:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x4b175f0'

如果有人可以告诉我要解决什么问题真的很棒,因为我很新,而且对此感到沮丧的时间太可怕了!

RootViewController.h

#import <UIKit/UIKit.h>
@class OverlayViewController;
@interface RootViewController : UITableViewController {

    NSArray *tableDataSource;
    NSString *CurrentTitle;
    NSInteger CurrentLevel;
    IBOutlet UITableView *tableView;
    NSDictionary *data;
    BOOL letUserSelectRow;

    OverlayViewController *ovController;

}
@property (nonatomic, retain) NSArray *tableDataSource;
@property (nonatomic, retain) NSString *CurrentTitle;
@property (nonatomic, readwrite) NSInteger CurrentLevel;
@property (nonatomic, retain) NSDictionary *data;

@end

我的RootViewController.m

#import "RootViewController.h"
#import "DetailViewController.h"
#import "LCPapersAppDelegate.h"

@implementation RootViewController
@synthesize tableDataSource, CurrentTitle, CurrentLevel;
@synthesize data;
#pragma mark -
#pragma mark View lifecycle


- (void)viewDidLoad {
    [super viewDidLoad];
    // Override point for customization after application launch.
    NSString *Path = [[NSBundle mainBundle] bundlePath];
    NSString *DataPath = [Path stringByAppendingPathComponent:@"data.plist"];

    NSDictionary *tempDict = [[NSDictionary alloc] initWithContentsOfFile:DataPath];
    self.data = tempDict;
    [tempDict release];

    if(CurrentLevel == 0) {
        NSLog(@"Initialize our table data source");
        //Initialize our table data source
        self.navigationItem.title = @"Leaving Cert. Papers";

        NSArray *tempArray = [[NSArray alloc] init];
        self.tableDataSource = tempArray;
        [tempArray release];


        self.tableDataSource = [data objectForKey:@"Rows"];

    }
    else 
        NSLog(@"self.navigationItem.title = CurrentTitle;");

    self.navigationItem.title = CurrentTitle;   

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
    // Release anything that's not essential, such as cached data
}

#pragma mark Table view methods

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


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSLog(@"Customize the number of rows in the table view.");
    return [self.tableDataSource count];
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Customize the appearance of table view cells.");
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }
    // Set up the cell...
    NSLog(@"Set up the cell...");
    NSLog(@"%d", indexPath.row);
    NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
    NSArray *array = [dictionary objectForKey:@"Title"];
    cell.text = [array objectAtIndex:indexPath.row];

    return cell;
}



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    //Get the selected Subject

    NSString *selectedSubject = nil;

        NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
        NSArray *array = [dictionary objectForKey:@"Title"];
        selectedSubject = [array objectAtIndex:indexPath.row];


    //Initialize the detail view controller and display it.
    DetailViewController *dvController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:[NSBundle mainBundle]];
    dvController.selectedSubject = selectedSubject;
    [self.navigationController pushViewController:dvController animated:YES];

    [dvController release];
    dvController = nil;
}

- (NSIndexPath *)tableView :(UITableView *)theTableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    if(letUserSelectRow)
        return indexPath;
    else
        return nil;
}

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath {

    //return UITableViewCellAccessoryDetailDisclosureButton;
    return UITableViewCellAccessoryDisclosureIndicator;
}

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {

    [self tableView:tableView didSelectRowAtIndexPath:indexPath];
}




- (void)dealloc {
    [data release];
    [ovController release];

    [super dealloc];
}


@end

在Luca Bernardi的要求下,继承人:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Rows</key>
    <array>
        <dict>
            <key>Title</key>
            <string>English</string>
            <key>Children</key>
            <array>
                <dict>
                    <key>Title</key>
                    <string>Paper 1</string>
                    <key>Children</key>
                    <array>
                        <dict>
                            <key>Title</key>
                            <string>2010</string>
                        </dict>
                        <dict>
                            <key>Title</key>
                            <string>2009</string>
                        </dict>
                    </array>
                </dict>
                <dict>
                    <key>Title</key>
                    <string>Paper 2</string>
                    <key>Children</key>
                    <array>
                        <dict>
                            <key>Title</key>
                            <string>2010</string>
                        </dict>
                        <dict>
                            <key>Title</key>
                            <string>2009</string>
                        </dict>
                    </array>
                </dict>
            </array>
        </dict>
        <dict>
            <key>Title</key>
            <string>Maths</string>
            <key>Children</key>
            <array>
                <dict>
                    <key>Title</key>
                    <string>Higher</string>
                    <key>Children</key>
                    <array>
                        <dict>
                            <key>Title</key>
                            <string>Paper 1</string>
                            <key>Children</key>
                            <array>
                                <dict>
                                    <key>Title</key>
                                    <string>2010</string>
                                    <key>Url</key>
                                    <string>http://x.ie/LC003ALP100EV.pdf</string>
                                </dict>
                                <dict>
                                    <key>Title</key>
                                    <string>2009</string>
                                    <key>Url</key>
                                    <string>http://x.ie/LC003ALP100EV.pdf</string>
                                </dict>
                            </array>
                        </dict>
                        <dict>
                            <key>Title</key>
                            <string>Paper 2</string>
                            <key>Children</key>
                            <array>
                                <dict>
                                    <key>Title</key>
                                    <string>2010</string>
                                    <key>Url</key>
                                    <string>http://examinations.ie/archive/exampapers/2010/LC003ALP200EV.pdf</string>
                                </dict>
                                <dict>
                                    <key>Title</key>
                                    <string>2009</string>
                                    <key>Url</key>
                                    <string>http://examinations.ie/archive/exampapers/2009/LC003ALP200EV.pdf</string>
                                </dict>
                            </array>
                        </dict>
                    </array>
                </dict>
                <dict>
                    <key>Title</key>
                    <string>Ordinary</string>
                    <key>Children</key>
                    <array>
                        <dict>
                            <key>Title</key>
                            <string>Paper 1</string>
                            <key>Children</key>
                            <array>
                                <dict>
                                    <key>Title</key>
                                    <string>2010</string>
                                    <key>Url</key>
                                    <string>http://www.examinations.ie/archive/exampapers/2010/LC003GLP100EV.pdf</string>
                                </dict>
                                <dict>
                                    <key>Title</key>
                                    <string>2009</string>
                                    <key>Url</key>
                                    <string>http://www.examinations.ie/archive/exampapers/2009/LC003GLP100EV.pdf</string>
                                </dict>
                            </array>
                        </dict>
                        <dict>
                            <key>Title</key>
                            <string>Paper 2</string>
                            <key>Children</key>
                            <array>
                                <dict>
                                    <key>Title</key>
                                    <string>2010</string>
                                    <key>Url</key>
                                    <string>http://www.examinations.ie/archive/exampapers/2010/LC003GLP200EV.pdf</string>
                                </dict>
                                <dict>
                                    <key>Title</key>
                                    <string>2009</string>
                                    <key>Url</key>
                                    <string>http://www.examinations.ie/archive/exampapers/2009/LC003GLP200EV.pdf</string>
                                </dict>
                            </array>
                        </dict>
                    </array>
                </dict>
            </array>
        </dict>
    </array>
</dict>
</plist>
enter code here

2 个答案:

答案 0 :(得分:0)

在这一行你实际上是在取一个字符串(“ English ”):

NSArray *array = [dictionary objectForKey:@"Title"];

接下来你做:

selectedSubject = [array objectAtIndex:indexPath.row];

这会崩溃,因为该对象是一个字符串,而不是一个数组。

这应该有效:

NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
cell.text = [dictionary objectForKey:@"Title"];

答案 1 :(得分:0)

为您的警告本地声明...... 看来你已经通过xib表了.... 并且您给出的名称必须是tableview ...而tableview委托和数据源方法中的名称也是tableview。

将tableview的名称更改为其他内容,例如presentTableView或您想要的内容。 现在这不会告诉你这种类型的警告......因为有同样的名字......

或者它可能是您在.h和.m文件中使用相同名称声明对象的原因

e.g. if i write 
NSString *myStr; 

在我的.h文件中

并在我的.m文件中,如果我也写

 NSString *myStr;
 myStr== [NSString stringWithFormat:@"bg%d_iPad.png"];

编译器将显示警告变量隐藏实例变量的本地声明。 希望这会对你有所帮助