NSDictionary到NSArray,会无法正常显示?

时间:2011-10-13 15:32:32

标签: iphone objective-c arrays xcode4 nsdictionary

我有一个签名页面,用户可以签名。 然后需要将其保存到NSDictionary,但是我想在TableView中为每个行或单元调用一个键列表作为文本。 这样:

“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中显示对象的名称?

2 个答案:

答案 0 :(得分:3)

我真的不明白你的问题究竟是什么。

首先,是您的字典是保留对象吗?

//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.来访问该对象,它将调用retain,您的对象将保持活动状态。否则,它将在方法结束时自动释放。这将解决您的字典在创建表视图时可能不存在/不可用的问题,并且您不必使用单例。

您要使用此代码访问的内容是什么?

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

[[UIApplication sharedApplication] delegate]您获得了应用程序委托(显然)。这些是MyAppNameAppDelegate个文件,但您将其视为FirstPage类 只需NSLog()来检查您是否得到了正确的课程,即您期望的课程。

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

这里有潜在的泄漏,你可以使用alloc-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

告诉我这是否可以解决您的问题或告诉我我是如何误解您的问题的。

答案 1 :(得分:-4)

我发现这个问题的答案实际上很简单,

我最终使用Singleton方法而不是全局变量方法。

现在,Singleton方法看起来很可怕,但它的退出简单,See here.

我从单身方法注意到全局方法的主要区别是, 全局方法需要大量转换和重新转换。 虽然Singleton方法在许多页面或类上使用单个对象。

现在我希望将来能更好地帮助人们!