2012-06-25 3 views
0

Теперь я изучаю класс UITableView для разработки iOS. Я хочу реализовать три раздела в моем TableView, но он всегда сбой, когда я нажимаю tabBarItem, который содержит tableView. Мой код ниже:Сбой при внедрении нескольких разделов в UITableView

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     self.title = @"Settings"; 
     self.tabBarItem.image = [UIImage imageNamed:@"19-gear.png"]; 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSArray *list1 = [[NSMutableArray alloc] initWithObjects:@"fbfb", @"dfhbfh", @"rtjtj", @"rgrrth", @"grhh", @"tyjtyj", nil]; 
    NSArray *list2 = [[NSMutableArray alloc] initWithObjects:@"fgngg", @"yjyj", @"rhrht", @"rthfh", @"tjtyjyj", @"fsfsdf", nil]; 
    NSArray *list3 = [[NSMutableArray alloc] initWithObjects:@"24242", @"24242", @"24242", @"4242", @"4242", @"24242", nil]; 

    self.array1 = list1; 
    self.array2 = list2; 
    self.array3 = list3; 

    [list1 release]; 
    [list2 release]; 
    [list3 release]; 
} 

#pragma mark - 
#pragma mark - TableView Data Source Methods 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 3; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    switch (section) { 
     case 0: 
      return [array1 count]; 
      break; 
     case 1: 
      return [array2 count]; 
      break; 
     case 2: 
      return [array3 count]; 
      break; 
     default: 
      break; 
    } 
    return 0; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cells = @"Cells"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cells]; 
    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cells]; 
    } 
    switch (indexPath.section) { 
     case 0: 
      cell.textLabel.text = [array1 objectAtIndex:indexPath.row]; 
      break; 
     case 1: 
      cell.textLabel.text = [array2 objectAtIndex:indexPath.row]; 
      break; 
     case 2: 
      cell.textLabel.text = [array3 objectAtIndex:indexPath.row]; 
      break; 
     default: 
      break; 
    } 
    return cell; 

} 

журнала аварии ниже:

2012-06-25 23:33:37.694 X-Factor[617:f803] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<SettingsViewController 0x6c912a0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key tableView.' 
*** First throw call stack: 
(0x13cd022 0x155ecd6 0x13ccee1 0x9c5022 0x936f6b 0x936edb 0x951d50 0x23971a 0x13cedea 0x13387f1 0x23826e 0xde1fc 0xde779 0xde99b 0xfa0a9 0xf9edd 0xf84aa 0xf834f 0xf9e14 0x13cee99 0x1a14e 0x1a0e6 0x2424bd 0x13cee99 0x1a14e 0x1a0e6 0xc0ade 0xc0fa7 0xc0b13 0x244c48 0x13cee99 0x1a14e 0x1a0e6 0xc0ade 0xc0fa7 0xc0266 0x3f3c0 0x3f5e6 0x25dc4 0x19634 0x12b7ef5 0x13a1195 0x1305ff2 0x13048da 0x1303d84 0x1303c9b 0x12b67d8 0x12b688a 0x17626 0x21c2 0x2135) 
terminate called throwing an exception(lldb) 
+0

Что говорит журнал аварий? Какая ошибка? это может быть быстрее, чем читать весь этот код, если бы вы знали, что искать – BBog

+0

Это не отвечает на ваш вопрос, но поскольку у вас есть три массива с данными, вы можете захотеть «вернуть 3» в 'numberOfSectionsInTableView:'. – Zappel

+0

Как определяются свойства 'array'n''? –

ответ

0

несколько пунктов:

а) я рекомендую использовать ARC, а не ручное управление памятью (как это делает Apple). ARC - это будущее Objective-C, и чем раньше вы начнете думать об объектных графах, чем сохраняете/освобождаете лучше.

б) Не используйте свойство в коде инициализации, используйте Ивар вместо (код предполагает, что вы синтезируете, как подчеркивание для Ивар)

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
if (self) { 
    _title = @"Settings"; 
    _tabBarItem.image = [UIImage imageNamed:@"19-gear.png"]; 
} 
return self; 

с) Вы должны вернуть количество секций в TableView (3), а не 2 вы ввели

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 3; 
} 

д) Ваш Tableview: метод numberOfRowsInSection в не последовательны. Поместите оператор break в каждый оператор switch. то есть:

switch (section) { 
    case 0: 
     return [array1 count]; 
     break; 
    case 1: 
     return [array2 count]; 
     break; 
    case 2: 
     return [array3 count]; 
     break; 
    default: 
     break; 
} 
return 0; 
+0

Спасибо! после изменения он все еще разбился, что мне делать? Я добавил журналы сбоев выше. –

+0

Можете ли вы использовать подсказку в следующей ссылке и сообщить нам, где происходит сбой? http://blog.manbolo.com/2012/01/23/xcode-tips-1-break-on-exceptions –

0

Это может быть вопрос времени - данные не готовы для чтения, когда представление таблицы должно быть заполнено. Попробуйте выполнить NSMutableArrays в initWithNibName (self.array1, self.array2 & self.array3) и подготовить данные в viewWillAppear, а не viewDidLoad. Кроме того, когда речь идет о нераспределенных свойствах (я предполагаю self.array1 и т.п. определяются как сохранить?) - использовать самостоятельно .array1

0

Это не будет исправить сбой, но вы будете иметь другие проблемы, если вы положить break; после:

case 1: 
    cell.textLabel.text = [array2 objectAtIndex:indexPath.row]; 
Смежные вопросы