1

私のコードは2つに分かれています:

1 つ目は、テーブル ビューの「cellForRowAtIndexPath」メソッドです。このテーブル ビューでは、各セルに 3 つのボタンを表示することになっており、各ボタンは異なる画像です。画像は NSMutableArray コール「photosArray」にあります。このように見えます。

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    if (photosArray.count > 0) {
        for (int i = 0; i < 3; i++) {
            if (photosArray.count > photoCounter) {

                //position the UiButtons in the scrollView
                CGRect frame = CGRectMake((i*100) + 30, 5, 60, 60);

                //Create the UIbuttons
                UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
                [button setTag:i];
                [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
                button.frame = frame;
                button.layer.borderWidth = 2;
                button.layer.cornerRadius = 5;
                button.clipsToBounds = YES;

                //Add images to the button

                NSLog(@"PhotosArray count is: %d",photosArray.count);
                if ([[photosArray objectAtIndex:0] isKindOfClass:[UIImage class]]) {
                    NSLog(@"UIImage class true");
                }
                if ([[photosArray objectAtIndex:0] isMemberOfClass:[UIImage class]]) {
                    NSLog(@"UIImage class true");
                }


                UIImage *btnImg = [self.photosArray objectAtIndex:photoCounter];
                //UIImage *btnImg2 = [UIImage imageNamed:@"GameOver"];
                photoCounter++;

                [button setBackgroundImage:btnImg forState:UIControlStateNormal];

                [cell.contentView addSubview:button];
            }
        }
    }else{
        UILabel *noImages = [[UILabel alloc] initWithFrame:CGRectMake(0, 25, 320, 20)];
        noImages.text = @"No images";
        noImages.textAlignment = NSTextAlignmentCenter;
        [cell.contentView addSubview:noImages];
    }

    return cell;
}

2 番目の部分は、写真を「photosArray」にロードする場所です。WSAssetPicker を使用して、アセット ライブラリから複数の写真を読み込みます。コードは次のとおりです。

- (void)assetPickerController:(WSAssetPickerController *)sender didFinishPickingMediaWithAssets:(NSArray *)assets
{
    // Dismiss the WSAssetPickerController.
    [self dismissViewControllerAnimated:YES completion:^{

    arep = [[ALAssetRepresentation alloc] init];

        for (ALAsset *asset in assets) {            
            UIImage *imageA = [[UIImage alloc] initWithCGImage:asset.defaultRepresentation.fullScreenImage];

            [self.photosArray addObject:imageA];
        }
        NSLog(@"%d",photosArray.count);

        photoCounter = 0;

        [self.tableView reloadData];
    }];
}

問題は、作成されたボタンに画像が含まれていないことです。境界線と角の丸い透明なボタンしか得られません。

何故ですか?

4

1 に答える 1

1

最近、README(現在は更新されています)から重要な部分を省略していることに気づきました。

dismissViewControllerAnimated:completion:完了ブロックでALAssetオブジェクトにアクセスする場合は、WSAssetPickerControllerの強力な参照を保持する必要があります。

ピッカーコントローラーを呼び出す前にピッカーコントローラーへの強い参照を保持していない場合dismissViewControllerAnimated:completion:、完了ブロックが実行される前にピッカーコントローラーが解放され、ALAssetsLibrary(WSAssetPickerコードで内部的に使用される)が解放されてから、デリゲートメソッドassetsで渡された配列。assetPickerController:didFinishPickingMediaWithAssets:

ALAssetsLibraryが解放されると、ALAssetsLibraryが所有するALAssetsは期限切れになり、への呼び出しはasset.defaultRepresentation.fullScreenImagenullを返します。

以下は、ピッカーコントローラーのビューを閉じている間、ALAssetsLibraryを保持します。

- (void)assetPickerController:(WSAssetPickerController *)sender didFinishPickingMediaWithAssets:(NSArray *)assets
{
    // Hang on to the picker to avoid ALAssetsLibrary from being released.
    self.picker = sender;

    __block id weakSelf = self; 
    // Note: Instead of `id` you could specify the class of `self` order to access properties with dot notation.

    // Dismiss the WSAssetPickerController.
    [self dismissViewControllerAnimated:YES completion:^{

        // Do something with the assets here.


        // Release the picker.
        [weakSelf setPicker:nil];
    }];
}

別の方法は、を呼び出す前にALAssetsの配列を処理することdismissViewControllerAnimated:completion:ですが、これにより、ピッカーコントローラーの却下が遅れ、ユーザーエクスペリエンスが低下する可能性があります。

于 2012-11-27T03:59:36.863 に答える