#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. Ну, что важно, так это проблема, с которой я столкнулся, которая помогла выше. возможно, вы были сбиты с толку или запутались в процессе, но, само собой разумеется, он все еще работал.