NSDictionary в NSArray, не будет отображаться должным образом?

#iphone #objective-c #arrays #xcode4 #nsdictionary

#iPhone #objective-c #массивы #xcode4 #nsdictionary

Вопрос:

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

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

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

FirstPage.m

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

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

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?

Комментарии:

1. Редактирую свой ответ в третий раз. 🙂 UIImages не обязательно имеют имя. Что вы хотите отобразить в табличном представлении? Имя или фактическое изображение?

2. я получаю ошибку в этой строке независимо от того, что я ставлю: [AppDelegate. SignatureSave allValues];

3. Я отредактировал свой ответ там. Что нужно сделать, так это сделать шаг назад и посмотреть, что вы действительно хотите сделать в табличном представлении.

4. К вашему сведению, NSLog отправляет description все аргументы объекта. Таким образом, передача [something description] эквивалентна печати [[something description] description] , что, конечно, довольно избыточно.

5. Спасибо, Чак. Я каждый день узнаю что-то новое.

Ответ №1:

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

прежде всего, является ли ваш словарь сохраненным объектом?

 //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]);
  

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

 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
  

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

Ответ №2:

Я обнаружил, что ответ на этот вопрос на самом деле прост,

В итоге я использовал метод Singleton вместо метода глобальной переменной.

Теперь одноэлементный метод выглядит устрашающе, но его выход прост, см. Здесь .

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

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

Комментарии:

1. Нет существенной разницы в удобстве использования или функциональности между одноэлементным и полем делегата приложения, если вы понимаете, что делаете. Каким-то образом вы перепутали объект делегата приложения с одним из ваших контроллеров представления (насколько я могу судить, с разреженным источником), поэтому, конечно, схема общего приложения не сработала.

2. Ну, что важно, так это проблема, с которой я столкнулся, которая помогла выше. возможно, вы были сбиты с толку или запутались в процессе, но, само собой разумеется, он все еще работал.