2

これは私がParseフォーラムで尋ねた質問であり、過去3日間彼らからの返信はありません。したがって、私はここに投稿しています。

やあ、

PFQueryTableViewControllerがあり、テーブルには画像と異なるラベルを持つカスタムセルがあります。このテーブルは、行を選択すると別のDetailViewControllerに移動します。DetailViewControllerは、ビューに画像を表示する必要があります。この画像は、PFQueryTableViewControllerのParseデータベースへのクエリから取得します。どうすればそれを達成できますか?

TABLEVIEWCONTROLLER.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

PFFileを取得したら、PFQueryTableViewControllerで、その画像を画像キャッシュに保存する必要があります。ファイルシステムまたはメモリに保存できます。NSCacheをメモリに配置する場合は、必要に応じて自動的にメモリを解放するため、NSCacheを使用することをお勧めします。次に、DetailViewControllerで画像を取得します。parseIdを画像キーとして使用できます。

質問に具体的に答えるために、PFFileはメモリまたはストレージにとどまることが保証されていないため、渡すことはできません。実際には特定の条件で実行される可能性があると思いますが、保証はされていません。PFFileが必要になるたびに、parseIdによってPFObjectを取得してから、PFFileをダウンロードする必要があります。これは2つのリクエストとしてカウントされます。ただし、Parseは独自のキャッシュを保持するほど賢いですが、存続期間は指定されておらず、保証されていません。最善の方法は、ファイルシステム、メモリ、またはコアデータを使用してデータを永続化することです。

于 2013-02-17T15:33:28.750 に答える
0

私は別のアプローチに頼りました、そしてそれは私にとってうまくいきます。しかし、NSCacheとその使用法について教えてくれたEddieに感謝します。

オブジェクトに関連付けられた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];
    });
});

このスレッドのおかげでiOSでURLを使用してUIIMAGEを作成する

再度、感謝します。アンドリュー

于 2013-02-19T12:06:10.573 に答える
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 に答える