TableView Сбой при заполнении из .plist (- [NSCFString objectAtIndex:]) - PullRequest
0 голосов
/ 26 февраля 2011

Эй, ребята, мое приложение вылетает при загрузке, и оно вызывает это при отладке:

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м

#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

По просьбе Луки Бернарди вот список:

<?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 голосов
/ 26 февраля 2011

К вашему предупреждению Локальное объявление ... Похоже, что вы взяли таблицу через xib .... и имя, которое вы дали, должно быть tableview ... и имя в делегате tableview и метод источника данных также tableview.

Измените имя вашего табличного представления на что-то другое, например presentTableView или что угодно.Теперь это не будет показывать вам этот тип предупреждения ... поскольку там было то же имя .....

Или это может быть причиной того, что вы объявили объект в ваших .h и .m файлах сто же имя

e.g. if i write 
NSString *myStr; 

в моем файле .h

и в моем файле .m, если я также напишу

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

Компилятор выдаст предупреждение о том, что локальное объявлениепеременная скрыть переменную экземпляра что-то в этом роде.Надеюсь, это поможет вам

0 голосов
/ 26 февраля 2011

В этой строке вы на самом деле извлекаете строку (" English "):

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

затем вы делаете:

selectedSubject = [array objectAtIndex:indexPath.row];

это происходит сбой, потому чтообъект является строкой, а не массивом.

Это должно работать:

NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
cell.text = [dictionary objectForKey:@"Title"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...