2

这是我在 Parse 论坛上提出的一个问题,过去 3 天我没有收到他们的任何回复。因此我在这里发帖。

你好,

我有一个 PFQueryTableViewController 并且表格有带有图像和不同标签的自定义单元格。此表在选择行时导航到另一个 DetailViewController。DetailViewController 需要在其视图中显示图像,我们从查询中获取到 PFQueryTableViewController 中的 Parse 数据库。我如何做到这一点?

表视图控制器.M

@interface TableViewController ()

@end

NSMutableArray* detailObjects;
DetObj* clickedObj;

@implementation TableViewController

- (void)objectsDidLoad:(NSError *)error {
    [super objectsDidLoad:error];

    // This method is called every time objects are loaded from Parse via the PFQuery

    for (PFObject* object in self.objects)
    {
        DetailObj* obj = [[DetailObj alloc ] init ];
        [obj setDetName:[object objectForKey:@"detName"]];
        [mov setDetImage:[object objectForKey:@"detImage"]];
        [detailObjects addObject:obj];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
{
    static NSString *CellIdentifier = @"upCell";

    customBigTableCell *cell = (customBigTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[customBigTableCell alloc] init];
    }

    cell.name.text = [object objectForKey:@"detName"];
    cell.image.file = [object objectForKey:@"detImage"];

    //this is essential for loading the image from the database
    [cell.image loadInBackground];

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [super tableView:tableView didSelectRowAtIndexPath:indexPath];

    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];

    newDetailController* newController = [storyboard instantiateViewControllerWithIdentifier:@"Detail"];

    clickedObj = [[DetObj alloc] init];

    NSIndexPath* path = [self.tableView indexPathForSelectedRow];

    clickedObj = [detailObjects objectAtIndex:path.row];

    [newController setDetInfo:clickedObj];

    [[self navigationController] pushViewController:newController animated:YES];
}

我已尝试在 DetailViewController 中使用如下所述的 PFImageView。detailInfo 是从前面的 PFQueryTableViewController 传递过来的对象。

newDetailController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    PFImageView* detImage = [[PFImageView alloc] initWithFrame:CGRectMake(300,0,320,150)];

    PFFile* file = detailInfo.fullImage.file;

    detImage.file = file;

    [detImage loadInBackground];

    [self.view addSubview:detImage];

}

但我有这个错误。

reason: '-[PFFile file]: unrecognized selector sent to instance

我不想再次查询数据库来获取我在前一个控制器中已经获得的信息。

谢谢安德鲁

4

3 回答 3

0

我采用了不同的方法,它对我很有效。但是感谢 Eddie 告诉我有关 NSCache 及其用法的信息。

我存储与对象关联的 PFFile 的 URL,然后将 URL 传递给下一个控制器。然后我使用以下代码显示图像-(void)viewDidLoad()

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    NSData *imageData = [NSData dataWithContentsOfURL: imgURL];

    dispatch_async(dispatch_get_main_queue(), ^{
        // Update the UI
        self.upImage.image = [UIImage imageWithData:imageData];
    });
});

感谢这个线程Create UIIMAGE with URL in iOS

再次感谢。安德鲁

于 2013-02-19T12:06:10.573 回答
0

在 PFQueryTableViewController 中获得 PFFile 后,您应该将该图像保存到图像缓存中。它可以存储在文件系统或内存中。如果将 NSCache 放在内存中,最好使用它,因为它会在需要时自动释放内存。然后在您的 DetailViewController 中获取图像。您可以使用 parseId 作为图像键。

要专门回答您的问题,您不能传递 PFFile,因为它不能保证保留在内存或存储中。我相信它实际上可能在某些条件下执行,但不能保证。每次需要PFFile时,都应该通过parseId得到一个PFObject,然后下载PFFile。这算作两个请求。然而,Parse 足够聪明,它保留了自己的缓存——但没有指定生命周期,也没有保证。最好的办法是使用文件系统、内存或核心数据来持久化数据。

于 2013-02-17T15:33:28.750 回答
0

我最近做了这样的事情。

ParseTableViewController.m

//----- CREATE SUBVIEW HERE -----//
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath     *)indexPath {
[super tableView:tableView didSelectRowAtIndexPath:indexPath];
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
PFObject *passObj = [self.objects objectAtIndex:indexPath.row];
HouseDataViewController *detailViewController = [[HouseDataViewController alloc] init];
[detailViewController setReceiveObj:passObj];
[self.navigationController pushViewController:detailViewController animated:YES];
}

DetailViewController.h

// include this to receive the object passed from the PFTableViewController
@property (nonatomic, strong) PFObject *ReceiveObj;

并在 DetailViewController.m

-(void)viewDidLoad {
if (self.ReceiveObj){

// House Image
    PFImageView *houseView = [[PFImageView alloc] init];
    houseView.frame = CGRectMake(border, y, 280, 196);
    houseView.image = [UIImage imageNamed:@"big_frame.png"];     // placeholder image
    houseView.file = (PFFile *)[detail objectForKey:@"house_picture"];
    //[houseView loadInBackground];
    [scrollView addSubview:houseView];
    [houseView loadInBackground:^(UIImage *image, NSError *error) {
        if (!error) {
            // do code here
        } else {
            // ... error
        }
    }];

  }

}
于 2013-06-08T01:27:58.993 回答