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
答案 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"];
编译器将显示警告变量隐藏实例变量的本地声明。 希望这会对你有所帮助