NSDictionary to NSArray, не будет отображаться правильно? - PullRequest
0 голосов
/ 13 октября 2011

У меня есть страница подписи, где пользователь может подписать свое имя.Затем он должен быть сохранен в NSDictionary, но я хочу вызвать список ключей, чтобы быть текстом в TableView для каждой строки или ячейки.Итак:

"viewImage = сохранен как объект для ключа: Случайное число"

Это довольно просто, сложная часть - когда я вызываю его на другой странице в TableView.Выход из приложения с ошибкой «SIGABRT».Теперь все мои делегаты на месте и работают ... я верю.Теперь вот пример кода:

FirstPage.m

UIImagePNGRepresentation(viewImage);
NSMutableArray *innerArray = [[NSMutableArray array]init];
[innerArray addObject:viewImage];
[SignatureSave setObject:innerArray forKey:@"5599"];

simple Достаточно, но не выдает ошибку.

SecondPage.m

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
FirstPage *appShare = (FirstPage *)[[UIApplication sharedApplication] delegate];
NSArray *dataDuplicate = [[NSArray alloc]init ];
dataDuplicate = [appShare.SignatureSave allKeysForObject:@"innerArray"];
static NSString *CellIdentifier = @"Cell";
NSLog(@"%@",dataDuplicate);
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero]autorelease];
}
if (dataDuplicate != nil) {
     cell.textLabel.text = [dataDuplicate objectAtIndex:indexPath.row];
}
else
{
    UIAlertView *CellAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Error Loading content, Try Again Later." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [CellAlert show];
    [CellAlert release];
}

return cell;
}
@end

Теперь, как мне получить viewImage для сохранения в NSDictionary, чтобы иметь возможность вызвать его на SecondPage и отобразить имя объектов в TableVIew?

Ответы [ 2 ]

3 голосов
/ 22 октября 2011

Я действительно не понимаю, в чем именно ваша проблема.

Прежде всего, Ваш словарь - это сохраненный объект?

//FirstPage.h

@property (nonatomic, retain) NSDictionary *SignatureSave;

//FirstPage.m

@synthesize SignatureSave;
…
UIImagePNGRepresentation(viewImage);
NSMutableArray *innerArray = [NSMutableArray array]; // using "array" is equivalent to alloc-init-autorelease
[innerArray addObject:viewImage];
[self.SignatureSave setObject:innerArray forKey:@"5599"];

// OR setting the array directly:

UIImagePNGRepresentation(viewImage);
NSArray *innerArray = [NSArray arrayWithObject:viewImage];
[self.SignatureSave setObject:innerArray forKey:@"5599"];

// OR even setting the image directly to the dictionary:

UIImagePNGRepresentation(viewImage);
[self.SignatureSave setObject:viewImage forKey:@"5599"];

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

что вы пытаетесь получить с помощью этого кода?

FirstPage *appShare = (FirstPage *)[[UIApplication sharedApplication] delegate];

с [[UIApplication sharedApplication] delegate] вы получите делегата вашего приложения (очевидно).Это файлы MyAppNameAppDelegate, но вы относитесь к ним как к классу FirstPage.
Просто NSLog(), чтобы проверить, что вы получаете правильный класс, который вы ожидаете.

NSLog(@"%@", [[[UIApplication sharedApplication] delegate] class]);

здесь у вас есть потенциальная утечка, вы выделяете init, но никогда не выпускаете ее:

NSArray *dataDuplicate = [[NSArray alloc]init ];
dataDuplicate = [appShare.SignatureSave allKeysForObject:@"innerArray"];

, кроме того, вы можете упростить ее (будет автоматически освобожден):

NSArray *dataDuplicate = [appShare.SignatureSave allKeysForObject:@"innerArray"];

и здесьу вас есть еще одна проблема.
Почему вы называете все ключи для объекта @"innerArray"?

у вас нет такого объекта, и во многих других случаях это неправильно.innerArray был вашим ранее названным массивом в FirstPage.m, но только вам, как разработчику, лучше запомнить переменную.После компиляции у него все равно будет загадочное имя.Вы можете получить доступ к своему ключу @"5599", если хотите, но я не думаю, что вы этого хотите.В вашем случае вы хотите получить доступ ко всем ключам словаря, поэтому просто позвоните:

NSArray *dataDuplicate = [appShare.SignatureSave allKeys];

, теперь у вас будет массив со всеми ключами вашего словаря, и вы можете обращаться к ним, как вы делаете с помощью objectAtIndex:.

NSString *keyName = [dataDuplicate objectAtIndex:indexPath.row];
cell.textLabel.text = keyName;
id theObject = [appShare.SignatureSave objectForKey:keyName]; // for example the image

Скажите, если это решит ваши проблемы, или скажите, как я неправильно понял ваш вопрос.

0 голосов
/ 17 октября 2011

Я нашел ответ на этот вопрос довольно простым на самом деле,

В итоге я выбрал метод Singleton вместо метода Global Variable.

Теперь метод Singleton выглядит ужасающе, но егоВыйти просто, См. здесь.

Основное отличие, которое я заметил от одноэлементного метода к глобальному, заключается в том, что глобальный метод требует много конвертации и реконвертации.Хотя метод Singleton работает с одним объектом на многих страницах или в разных классах.

Теперь я надеюсь, что это поможет людям и в будущем!

...