У меня проблема с сохранением данных во вложенном NSDictionary. Или это что-то с NSMutableDictionary сделает эту работу? Посмотрите, я постараюсь объяснить как можно лучше.
Мой .h файл выглядит так:
@interface MyViewController : UIViewController
<UITableViewDataSource, UITableViewDelegate>
{
NSDictionary *fullData;
IBOutlet UITableView *tableView;
}
@property (nonatomic, retain) NSDictionary *fullData;
@property (nonatomic, retain) UITableView *tableView;
@end
Я установил свои начальные значения в viewDidLoad
- (void)viewDidLoad {
...
fullData = [NSDictionary dictionaryWithContentsOfURL:url];
[fullData retain];
[super viewDidLoad];
}
И это прекрасно работает, когда я пытаюсь вставить его в UITableViewCells и все, что мне нужно сделать, даже если я делаю NSLog, который печатает здесь fullData, все данные будут отображаться.
вот так:
2010-11-24 14:49:53.334 MyApp[25543:40b] {
items = (
{
id = 5;
localId = 1;
name = "A name1";
},
{
id = 8;
localId = 3;
name = "A name2";
},
{
id = 9;
localId = 4;
name = "A name3";
},
{
id = 10;
localId = 5;
name = "A name4";
},
{
id = 11;
localId = 6;
name = "A name5";
}
);
results = 5;
}
Хотя это работает отлично, я хочу сохранить fullData в других моих событиях, например didSelectRowAtIndexPath. Прежде всего, я должен сохранить, а также, если я сделаю, будут сохранены только данные первого уровня. элементы dict просто укажут на некоторую память, которой нет.
Итак, я стараюсь:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Data: %@", fullData);
}
И это иногда возвращает это:
2010-11-24 14:44:28.288 MyApp[25493:40b] Data: {
items = (
"<_NSIndexPathUniqueTreeNode: 0x9d2a820>",
"<CALayer: 0x9d27980>",
"<CALayer: 0x9d2bc30>",
"<CALayer: 0x9d29830>",
"<CALayer: 0x9d299e0>"
);
results = 5;
}
Кажется, что некоторые значения сохраняются, однако доступ к данным внутри элементов невозможен. Для меня лучше хранить данные в локальном файле и затем снова обращаться к ним на этом этапе, или можно сохранить полный словарь?
Я пытался добавить [[fullData objectForKey:@"items"] retain];
Я довольно новичок в этом, поэтому мне нужна помощь, чтобы мой код также следовал рекомендациям. Я перепробовал множество решений и посмотрел несколько фильмов из яблок и других мест тоже. Я просто не могу решить это. Это может быть просто, но я не знаю, где искать.
Спасибо.
<Ч />
Извините, я сам решил проблему
Я не включил эту функцию:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Retain count: %i", [fullData retainCount]);
UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:@"cell"];
// create a cell
if( cell == nil )
{
cell = [[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"cell"];
}
// fill it with content
NSArray *current = [[fullData objectForKey:@"items"] objectAtIndex:indexPath.row];
NSString *rowLabel = [NSString stringWithFormat:@"%@, %@",[current valueForKey:@"localId"], [current valueForKey:@"name"]];
cell.textLabel.text = rowLabel;
[current release];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
// return it
return cell;
}
И проблема в том, что я освобождаю текущую переменную в каждой строке таблицы. Это должно быть результатом того, что экземпляр в переменной current не является копией, а является реальной ссылкой.
В любом случае, спасибо.