У меня проблема с сохранением данных во вложенном NSDictionary. Или это что-то с NSMutableDictionary, которое сделает эту работу? Взгляните, я попытаюсь объяснить как можно лучше.iPhone dev, NSDictionary, как сохранить полный дикт?
Мой .h файл выглядит следующим образом:
@interface MyViewController : UIViewController
<UITableViewDataSource, UITableViewDelegate>
{
NSDictionary *fullData;
IBOutlet UITableView *tableView;
}
@property (nonatomic, retain) NSDictionary *fullData;
@property (nonatomic, retain) UITableView *tableView;
@end
Я создал свой inits в 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;
}
И вопрос в том, что я выпускаю текущую переменную каждую строку в таблице. Это должно быть результатом того, что экземпляр в переменном токе не является копией, а является реальной ссылкой.
Спасибо в любом случае.
Я изменил код, так что я больше не использую Autorelease (fullData = [NSDictionary dictionaryWithContentsOfURL: url]; становится fullData = [[NSDictionary alloc] initWithContentsOfURL: url];), а счетчик останков по-прежнему один в файле didSelectRowAtIndexPath. – Oldek 2010-11-24 14:14:30