Я создаю приложение панели вкладок, в котором есть три вкладки, каждая из которых загружает свой .plist в представление развернутой таблицы. Я наконец-то смог настроить его так, чтобы по крайней мере отображался первый уровень, но мое приложение зависало, если вы пытались выбрать один из них. Я не уверен, что это так, как я связал в конструкторе интерфейсов (подробнее позже), но есть очевидная проблема.
Единственной вещью, которую я построил в своем делегате приложения, был контроллер навигации для управления моим представлением. Я использую шаблон панели вкладок, чтобы он был уже создан. Я изменил режим первого просмотра на контроллер навигации. Я создал его как IBOutlet, чтобы я мог связать контроллер навигации с соответствующей переменной, которую я создал в делегате приложения.
Вот код инициализации моего первого просмотра:
@interface IndustryTableView : UITableViewController {
NSDictionary *industryData;
NSArray *tableDataSource;
NSString *CurrentTitle;
NSInteger CurrentLevel;
}
@property (nonatomic, retain) NSDictionary *industryData;
@property (nonatomic, retain) NSArray *tableDataSource;
@property (nonatomic, retain) NSString *CurrentTitle;
@property (nonatomic, readwrite) NSInteger CurrentLevel;
@end
Мои файлы импортируются в реализацию. Вот соответствующий код из этого
- (void)viewDidLoad {
NSString *Path = [[NSBundle mainBundle] bundlePath];
NSString *DataPath = [Path stringByAppendingPathComponent:@"IndustryData.plist"];
NSDictionary *tempDict = [[NSDictionary alloc] initWithContentsOfFile:DataPath];
self.industryData = tempDict;
[tempDict release];
if(CurrentLevel == 0) {
NSArray *tempArray = [[NSArray alloc] init];
self.tableDataSource = tempArray;
[tempArray release];
self.tableDataSource = [self.industryData objectForKey:@"Rows"];
self.navigationItem.title = @"Back";
}
else
self.navigationItem.title = CurrentTitle;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//Get the dictionary of the selected data source.
NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
//Get the children of the present item.
NSArray *Children = [dictionary objectForKey:@"Children"];
Jqt62m7AppDelegate *AppDelegate = (Jqt62m7AppDelegate *) [[UIApplication sharedApplication] delegate];
if([Children count] == 0) {
DetailView *dvController = [[DetailView alloc] initWithNibName:@"DetailView" bundle:[NSBundle mainBundle]];
[AppDelegate.indNavControl pushViewController:dvController animated:YES];
[dvController release];
}
else {
//Prepare to tableview.
IndustryTableView *indViewControl = [[IndustryTableView alloc] initWithNibName:@"IndustryView" bundle:[NSBundle mainBundle]];
//Increment the Current View
indViewControl.CurrentLevel += 1;
//Set the title;
indViewControl.CurrentTitle = [dictionary objectForKey:@"Title"];
//Push the new table view on the stack
[AppDelegate.indNavControl pushViewController:indViewControl animated:YES];
indViewControl.tableDataSource = Children;
[indViewControl release];
}
}
Ошибка при сбое - Программа получила SIGABRT, очень распространенная проблема. Это происходит в строке [AppDelegate.indNavControl pushViewController: indviewControl animated: YES]; Если это кому-нибудь поможет, это код отладки:
(
0 CoreFoundation 0x00dc25a9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x00f16313 objc_exception_throw + 44
2 CoreFoundation 0x00d7aef8 +[NSException raise:format:arguments:] + 136
3 CoreFoundation 0x00d7ae6a +[NSException raise:format:] + 58
4 UIKit 0x0020f0fa -[UINib instantiateWithOwner:options:] + 2024
5 UIKit 0x00210ab7 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 168
6 UIKit 0x000c6628 -[UIViewController _loadViewFromNibNamed:bundle:] + 70
7 UIKit 0x000c4134 -[UIViewController loadView] + 120
8 UIKit 0x0021ddd8 -[UITableViewController loadView] + 80
9 UIKit 0x000c400e -[UIViewController view] + 56
10 UIKit 0x000c2482 -[UIViewController contentScrollView] + 42
11 UIKit 0x000d2f25 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 48
12 UIKit 0x000d1555 -[UINavigationController _layoutViewController:] + 43
13 UIKit 0x000d27aa -[UINavigationController _startTransition:fromViewController:toViewController:] + 326
14 UIKit 0x000cd32a -[UINavigationController _startDeferredTransitionIfNeeded] + 266
15 UIKit 0x000d4562 -[UINavigationController pushViewController:transition:forceImmediate:] + 932
16 UIKit 0x000cd1c4 -[UINavigationController pushViewController:animated:] + 62
17 Jqt62m7 0x00002a78 -[IndustryTableView tableView:didSelectRowAtIndexPath:] + 952
18 UIKit 0x0008bb68 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1140
19 UIKit 0x00081b05 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 219
20 Foundation 0x0079b79e __NSFireDelayedPerform + 441
21 CoreFoundation 0x00da38c3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
22 CoreFoundation 0x00da4e74 __CFRunLoopDoTimer + 1220
23 CoreFoundation 0x00d012c9 __CFRunLoopRun + 1817
24 CoreFoundation 0x00d00840 CFRunLoopRunSpecific + 208
25 CoreFoundation 0x00d00761 CFRunLoopRunInMode + 97
26 GraphicsServices 0x00ffa1c4 GSEventRunModal + 217
27 GraphicsServices 0x00ffa289 GSEventRun + 115
28 UIKit 0x00022c93 UIApplicationMain + 1160
29 Jqt62m7 0x00001cc9 main + 121
30 Jqt62m7 0x00001c45 start + 53
)
terminate called throwing an exceptionCurrent language: auto; currently objective-c
(gdb)
Так что я долго спрашиваю - почему моя программа падает?