UITableview вылетает по адресу numberOfRowsInSection;Json в NSDictionary для UITableview - PullRequest
0 голосов
/ 23 ноября 2011

Я получил Json с JSONKit из url в NSDictionary в initWithNibName

    NSData *jsonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:jsonUrl]];
    JSONDecoder *jsonKitDecoder = [JSONDecoder decoder];
    jsonDic = [jsonKitDecoder parseJSONData:jsonData];    // NSDictionary *jsonDic
    NSLog(@"Json Dictionary Fetched %@", jsonDic); // Display the Json fine :-)
    NSLog(@"Dictionary Count %i", [jsonDic count]); // Display the Dic count fine :-)
    array = [jsonDic objectForKey:@"courses"];    // NSArray *array
    NSLog(@"Courses Found %@", array); // Display the array fine :-)
    NSLog(@"Courses Count %i", [array count]);

Вот Json

    { "name":"Name 1" , "courses": [
        { "title":"Course 1" , "desc":"This is course 1" }, 
        { "title":"Course 2" , "desc":"This is course 2" }, 
        { "title":"Course 3" , "desc":"This is course 3" }  ]
    }

Я перетащил представление таблицы в xib.установите IBOutlet UITableview tblView для таблицы в Connections в Интерфейсном Разработчике, а также для источника данных tableview и делегируйте в FilesOwner

добавленные вручную события tableview как

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        int cnt = [array count];    // CRASHES HERE Remeber returning 1; still why ?
        return 1;
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {     
        static NSString *CellIdentifier = @"Cell";   
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
        }
        int indx = [indexPath indexAtPosition:1];
        /* THESE ARE ALL COMMENTED
        NSString *key = [[jsonDic allKeys] objectAtIndex:indx];
        NSString *value = [jsonDic objectForKey:key];
        cell.textLabel.text = value;
        /* / THESE ARE ALL COMMENTED
        NSDictionary *eachItem = [array objectAtIndex:indx];
        cell.textLabel.text = [eachItem objectForKey:@"title"];
        // */
        cell.textLabel.text = @"My Title"];
        return cell;
    }

Кто-то, пожалуйста, помогите мне в этом.Мне нужно отобразить курсы в виде таблицы.

1 Ответ

0 голосов
/ 23 ноября 2011

Ваш объект массива, вероятно, освобождается, что приводит к падению (EXEC_BAD_ACCESS?), Если вы отправляете ему сообщение (здесь считается). С линии

array = [jsonDic objectForKey:@"courses"];    // NSArray *array

Похоже, что он автоматически выпущен, вы должны сохранить его.

EDIT:

Вы можете сохранить его:

Установка его в качестве свойства сохранения

@property(nonatomic, retain) NSArray* array;

и с помощью средства доступа

self.array = [jsonDic objectForKey:@"courses"]; 

, который автоматически освобождает старое значение и сохраняет новое. Или, сохранив его явно

array = [[jsonDic objectForKey:@"courses"] retain];

тогда вы не должны забывать отпустить его, когда закончите, иначе вы потеряете память. Вам следует прочитать Расширенное руководство по программированию для управления памятью , оно дает вам подробное объяснение, и очень важно, чтобы вы понимали основные приемы.

...