2014-11-17 2 views
-1

Думал, что я был на рулоне, а затем снова упал на лицо.UITableView blank

После ввода моего кода для сортировки данных plist в разделы мое табличное представление показывает пробел. Заметим, что я повторно подключил dataSource и делегировать, и знаю, что prepareForSegue не прав - после того, как у меня появятся ячейки, которые я обновляю (работал без разделов). Это, очевидно, я, но я не вижу ошибки, и она прекрасно строится.

Пс: Я знаю, что он не оптимизирован для управления памятью. Как только tableview будет работать, я буду объявлять свойство ключей и сортировать их в это и т. Д. Кроме того, причина, по которой нет инструкций NSLog, заключается в том, что мой XCODE ничего не выводит на консоль.

Благодаря

#import "RCViewController.h" 
#import "detailView.h" 

@interface RCViewController() 

@end 

@implementation RCViewController 

@synthesize orderedPlistWords, tableView; 
@synthesize alphabeticallySortedWords; 

static NSString *CellIdentifier = @"Cell Identifier"; 

-(NSDictionary *)alphabeticallySortedWords:(NSArray *)wordsArray { 
    NSMutableDictionary *buffer = [[NSMutableDictionary alloc]init]; 

    for (NSDictionary *dict in orderedPlistWords) { 
     NSString *word = [dict objectForKey:@"Word"]; 
     NSString *firstLetter = [[word substringToIndex:1]uppercaseString]; 

     if ([buffer objectForKey:firstLetter]) { 
      [(NSMutableArray *)[buffer objectForKey:firstLetter]addObject:dict]; 
     } 
     else { 
      NSMutableArray *mutableArray = [[NSMutableArray alloc]initWithObjects:dict, nil]; 
      [buffer setObject:mutableArray forKey:firstLetter]; 
     } 
    } 
    NSArray *keys = [buffer allKeys]; 
    for (int j; j<keys.count; j++) { 
     NSString *key = [keys objectAtIndex:j]; 
     [(NSMutableArray *)[buffer objectForKey:key]sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 
    } 
    NSDictionary *result = [NSDictionary dictionaryWithDictionary:buffer]; 
    return result; 

} 


-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 

    NSArray *keys = [self.alphabeticallySortedWords allKeys]; 
    return [keys count]; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 




    NSArray *unsortedKeys = [self.alphabeticallySortedWords allKeys]; 
    NSArray *sortedKeys = [unsortedKeys sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 
    NSString *key = [sortedKeys objectAtIndex:[indexPath section]]; 
    NSArray *wordsForSection = [[self.alphabeticallySortedWords objectForKey:key]objectForKey:@"Word"]; 
    NSString *word = [wordsForSection objectAtIndex:[indexPath row]]; 

    [cell.textLabel setText:word]; 

    return cell; 

} 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    NSArray *unsortedKeys = [self.alphabeticallySortedWords allKeys]; 
    NSArray *sortedKeys = [unsortedKeys sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 
    NSString *key = [sortedKeys objectAtIndex:section]; 
    NSArray *wordsForSection = [[self.alphabeticallySortedWords objectForKey:key]objectForKey:@"Word"]; 
    return [wordsForSection count]; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 


    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    [self performSegueWithIdentifier:@"showDetail" sender:cell]; 
} 


-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    NSArray *keys = [[self.alphabeticallySortedWords allKeys]sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 
    NSString *key = [keys objectAtIndex:section]; 
    return key; 
} 


-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if ([segue.identifier isEqualToString:@"showDetail"]) { 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     detailView *destViewController = segue.destinationViewController; 

     destViewController.word = [[self.orderedPlistWords objectAtIndex:indexPath.row]valueForKey:@"Word"]; 
     destViewController.definition = [[self.orderedPlistWords objectAtIndex:indexPath.row]valueForKey:@"Definition"]; 
    } 
} 



- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    NSString *plistPath = [[NSBundle mainBundle]pathForResource:@"words" ofType:@"plist"]; 
    NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"Word" ascending:YES selector:@selector(caseInsensitiveCompare:)]; 


    NSMutableArray *plistWords = [[NSMutableArray alloc]initWithContentsOfFile:plistPath]; 
    self.orderedPlistWords = [plistWords sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]]; 

    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:CellIdentifier]; 

} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@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"> 
<array> 
    <dict> 
     <key>Word</key> 
     <string>Pitch</string> 
     <key>Definition</key> 
     <string>Ground players play on</string> 
    </dict> 
    <dict> 
     <key>Word</key> 
     <string>Goal</string> 
     <key>Definition</key> 
     <string>Point awarded when ball crosses goal line</string> 
    </dict> 
    <dict> 
     <key>Word</key> 
     <string>Yellow Card</string> 
     <key>Definition</key> 
     <string>Penalise player for foul</string> 
    </dict> 
</array> 
</plist> 

ответ

0

У вас есть свойство, alphabeticallySortedWords, которые ссылаются на ваши UITableViewDataSource методы, но вы никогда не заполнить. У вас есть аналогичный метод, alphabeticallySortedWords, но он принимает параметр массива.

Всякий раз, когда у вас возникают подобные проблемы. Поставьте точки останова в numberOfRowsInSection и numberOfSectionsInTableView. Это подтвердит, что эти методы вообще вызываются (т. Е. Убедитесь, что базовый класс вашей сцены установлен правильно, убедитесь, что вы установили источник данных для свойства представления таблицы и т. Д.). В этом случае, если бы вы это сделали, вы бы сразу обнаружили, что alphabeticallySortedWords был nil.


Кстати, есть и другие ошибки здесь, тоже:

В numberOfRowsInSection, у вас есть линия, которая говорит:

NSArray *wordsForSection = [[self.alphabeticallySortedWords objectForKey:key] objectForKey:@"Word"]; 

Оно должно быть:

NSArray *wordsForSection = [self.alphabeticallySortedWords objectForKey:key]; 

Аналогичным образом в cellForRowAtIndexPath у вас есть строки, которые говорят:

NSArray *wordsForSection = [[self.alphabeticallySortedWords objectForKey:key] objectForKey:@"Word"]; 
NSString *word = [wordsForSection objectAtIndex:[indexPath row]]; 

Они должны быть:

NSArray *wordsForSection = [self.alphabeticallySortedWords objectForKey:key]; 
NSString *word = [[wordsForSection objectAtIndex:[indexPath row]] objectForKey:@"Word"]; 

В обоих этих ситуациях вы извлекаете Word в неправильное время.

+0

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

+0

Ну, у вас есть метод, который вы написали, который строит эту структуру, 'alphabeticallySortedWords:', поэтому (а) вызовите эту процедуру после завершения чтения plist; и (б) изменить эту процедуру, чтобы фактически сохранить результаты в свой аналогичный именованный объект. Честно говоря, я также изменил бы название этого метода, чтобы устранить любую путаницу между свойством и методом, который создает это свойство. – Rob

+0

Удалив параметр из метода, приложение работает как запланировано. Однако, чтобы сделать это, это неправильно - следует ли мне вызвать метод в viewdidload? Прошу прощения, если я waffling - я очень ценю помощь ☺ – user3692490