简体   繁体   中英

TableView Crashes when populates from .plist (-[NSCFString objectAtIndex:])

Hey guys, my app crashes upon load and it throws up this when debugging:

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'

It'd be really great if someone could tell me what to fix, as I'm fairly new and the hours spent frustrated over this have been horrible!

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

and my 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

At Luca Bernardi's request, heres the plist:

<?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

At this line you are actually fetching a string (" English "):

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

next you do:

selectedSubject = [array objectAtIndex:indexPath.row];

this crashes because the object is a string, not an array.

This should work:

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

For your warning Local declaration... It seems that you have taken table through xib.... and the name you have given must be tableview...and the name in the tableview delegate and data source method is also tableview.

Change the name of your tableview to something else,like presentTableView or what ever you want. Now this will not show you this type of warning..as there was the same name.....

Or it may be the cause that you have declared object in your .h and .m file with the same name

e.g. if i write 
NSString *myStr; 

in my .h file

and in my .m file if i also write

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

The compiler will show warning that local declaration of variable hide instance variable something like that. Hope this will help you

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM