Я разрабатываю приложение для iPhone, которое представляет собой tabViewController с одной из вкладок, включая tableView.Можно коснуться объектов в таблице, чтобы перейти на заставку с информацией об этом конкретном объекте.
Вот как я настраиваю массив tableView:
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//each table view cell has its own identifier.
static NSString *cellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier] autorelease];
}
NSUInteger row = [indexPath row];
cell.textLabel.text = [sitesArray objectAtIndex:row];
cell.imageView.image = [imagesArray objectAtIndex:row];
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
return cell;
}
- (void)viewDidLoad {
NSArray *pageHolder = [[NSArray alloc] initWithObjects:@"CSLP", @"NSLS", @"LSPA", @"SIOP", @"Transfer", nil];
self.pages = pageHolder;
[pageHolder release];
NSArray *sites = [[NSArray alloc] initWithObjects:@"CSLP", @"NSLS", @"LSPA", @"SIOP", @"Transfer Vision Program ", nil];
self.sitesArray = sites;
UIImage *cslp = [UIImage imageNamed:@"CSLP LOGO.png"];
UIImage *nsls = [UIImage imageNamed:@"NSLS LOGO.png"];
UIImage *lspa = [UIImage imageNamed:@"LSPA LOGO.png"];
UIImage *siop = [UIImage imageNamed:@"SIOP LOGO.png"];
UIImage *transfer = [UIImage imageNamed:@"TRANSFER LOGO.png"];
NSArray *images = [[NSArray alloc] initWithObjects: cslp, nsls, lspa, siop, transfer, nil];
[sites release];
self.imagesArray = images;
UIButton* modalViewButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[modalViewButton addTarget:self action:@selector(modalViewAction:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *modalBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:modalViewButton];
self.navigationItem.rightBarButtonItem = modalBarButtonItem;
[modalBarButtonItem release];
[self.table reloadData];
}
А вот мой метод didSelectRowAtIndexPath
-(void) tableView:(UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath
{
NSInteger row = [indexPath row];
NSMutableDictionary *rowData = [table objectAtIndex:indexPath.row];
UIViewController *targetViewController = [rowData objectForKey:kViewControllerKey];
if (!targetViewController)
{
// The view controller has not been created yet, create it and set it to our menuList array
NSString *viewControllerName = [[pages objectAtIndex:indexPath.row] stringByAppendingString:@"ViewController"];
targetViewController = [[NSClassFromString(viewControllerName) alloc] initWithNibName:viewControllerName bundle:nil];
[rowData setValue:targetViewController forKey:kViewControllerKey];
[targetViewController release];
}
SSARC_App_2AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
[delegate.orgsNavigationController pushNavigationItem:targetViewController animated:YES];
[delegate release];
}
Приложение падает при первом вызове objectAtIndex в didSelectRowAtIndexPathметод.Консоль сообщает:
010-11-22 12: 50: 17.113 SSARC App 2 [43470: 207] - [UITableView objectAtIndex:]: нераспознанный селектор, отправленный экземпляру 0x601e800 2010-11-22 12: 50: 17.116 Приложение 2 SSARC [43470: 207] * Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [UITableView objectAtIndex:]: нераспознанный селектор, отправленный экземпляру 0x601e800' * Стек вызовов впервый бросок:
Теперь у меня есть предупреждение о том, что «UITableView может не отвечать на ObjectAtIndex».Я предполагаю, что это главная проблема здесь, однако я не уверен, как ее решить.Интересно, что я везде искал эту проблему и нигде не могу ее найти, поэтому мне любопытно узнать, сталкивался ли кто-нибудь с этой проблемой и как ее решить.Будем признательны любому совету.Дайте мне знать, если вам понадобится дополнительная информация.
Я занимался кодированием самостоятельно и получил его для компиляции без каких-либо ошибок или предупреждений, но он все равно дает сбой.В настоящее время это то, что у меня есть:
NSMutableDictionary *rowData = [self.menuList objectAtIndex:indexPath.row];
UIViewController *targetViewController = [rowData objectForKey:kViewControllerKey];
if (!targetViewController)
{
// The view controller has not been created yet, create it and set it to our menuList array
NSString *viewControllerName = [[pages objectAtIndex:indexPath.row] stringByAppendingString:@"ViewController"];
targetViewController = [[NSClassFromString(viewControllerName) alloc] init];//WithNibName:viewControllerName bundle:nil];
NSLog(@"targetViewController: %@", targetViewController);
[rowData setValue:targetViewController forKey:kViewControllerKey];
[targetViewController release];
}
SSARC_App_2AppDelegate *delegate = (SSARC_App_2AppDelegate*)[[UIApplication sharedApplication] delegate];
[[delegate orgsNavigationController] pushViewController:targetViewController animated:YES];
[delegate release];
delegate = nil;
Проблема, о которой сообщает отладчик, заключается в том, что viewControllerName имеет значение «Out of Scope».Я не очень понимаю, что это значит, потому что когда я использую NSLog, viewControllerName инициализируется.Означает ли это, что он не может найти класс, на который я ссылаюсь?Пожалуйста, дайте мне знать.