我想知道,保存和发送数据的“正确”方法是什么。比方说,我们收到JSON。它的结构类似于:
{
id = 1;
country_id = 298;
date = "2012-11-08 14:00:36";
name = "Mr. Blank";
profile = "http://somewhere.com/user1234/profile.png";
}
现在,我们有tableView,在CustomCell中我们显示配置文件pic,名称和国家ID。点击后,我们想要转换到详细视图,我们再次显示个人资料图片,以及基于他的ID(基本上是新的api调用)的其他信息。
现在,当我们收到第一个JSON时,我们应该考虑如何保存和发送id和profile pic等值。
我知道两种方法,但我不确定,如果它们是“正确的”。 首先是,一旦你的json到达,就将所有内容保存到数组中。所以它看起来像这样
NSMutableArray *idArr = [[NSMutableArray alloc]init];
NSMutableArray *picArr = [[NSMutableArray alloc]init];
for (NSDictionary *recDict in jsonResults)
{
NSString *personsID = [recDict objectForKey:@"id"];
[idArr addObject:personsID];
NSString *pic = [recDict objectForKey:@"profile"];
[picArr addObject:pic];
}
此方法有效,但它始终将JSON中的所有内容保存到数组中。所以当有很多行时,需要很长时间(特别是如果图片很大)。我知道,异步加载可能是解决方案,但我想在这里讨论原则。
另一种方法是直接从所选单元格传递值。这意味着,在方法didSelectRowAtIndexPath
中执行此操作- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
MyCustomCell *cell = (MyCustomCell *)[tableView cellForRowAtIndexPath:indexPath];
imageToSend = cell.profilePic.image; //we have UIImage *imageToSend;
idToSend = cell.idLabel.text; //we have NSString *idToSend;
[self performSegueWithIdentifier:@"showDetail" sender:self];
}
这种方法的优点似乎是,tableView默认使用“lazyload”(这意味着它会在用户向下滚动时加载单元格),所以在我看来,与第一种方法相比,它可以节省时间。
请问您如何传递价值观?我知道您应该使用prepareForSegue方法,但是您无法访问indexPath.row。 (因此,您可以识别该segue的调用位置)
答案 0 :(得分:1)
我更喜欢第二个。您无需保存所有图像,只需保存URL。应该异步加载图像(我使用EGOImageLoading),然后您可以将图像或URL发送到新视图。
您可以使用tableView indexPathForSelectedRow从该行传递数据:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
NSIndexPath *path = [self.tableView indexPathForSelectedRow];
YourObject *yourObject = [objectsArray objectAtIndex:path.row];
[segue.destinationViewController setObject:yourObject];
}