在 viewDidLoad 外部调用方法时未显示相机胶卷中的最后一张图像

Posted

技术标签:

【中文标题】在 viewDidLoad 外部调用方法时未显示相机胶卷中的最后一张图像【英文标题】:last image in Camera Roll not shown when method called outside viewDidLoad 【发布时间】:2014-07-28 10:42:01 【问题描述】:

我正在使用代码 sn-p 从相机胶卷中获取最后一张图片。我已经创建了一个方法,并在viewDidLoad 方法中调用它。当我点击按钮时,我正在使用此功能通过社交框架分享最后一张图片。这样一切正常。

问题是当我尝试从viewDidLoad 替换我的方法并将其放入IBAction 时,图片不会在社交弹出窗口中呈现。调试显示我的方法返回它应该返回的内容,一个图像,并且它在触摸按钮时被触发。由于加载此 viewController 时最新图像会发生变化,因此不能从 viewDidLoad 调用它。这是代码。

方法:

- (void) LastPic

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) 
    [group setAssetsFilter:[ALAssetsFilter allPhotos]];
    [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *innerStop) 
        if (alAsset) 
            ALAssetRepresentation *representation = [alAsset defaultRepresentation];
            UIImage *latestPhoto = [UIImage imageWithCGImage:[representation fullScreenImage]];
            *stop = YES; *innerStop = YES;
            self.imageToShare = latestPhoto;
        
    ];
 failureBlock: ^(NSError *error) 
    NSLog(@"No groups");
];

行动:

- (IBAction)ShareT:(id)sender 
[self LastPic]; //when in viewDidLoad everything kk
if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])
    self.slComposeViewController = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
    [self.slComposeViewController addImage:self.imageToShare];
    [self presentViewController:self.slComposeViewController animated:YES completion:NULL];

else

我启用了所有必要的框架,我的 h 文件看起来像这样。当我尝试修改代码以将图像作为NSData 传递时,也会发生同样的情况。

@property (strong, nonatomic) UIImage *imageToShare;

谢谢!

【问题讨论】:

【参考方案1】:

发生这种情况是因为 ALAssets 正在块中获取。这意味着,您在尚未获取图像时调用 Share 控制器。我建议您添加一些进度 hud,例如 this,延迟 2-3 秒。这将解决您的问题,并且对用户友好。要检查它是否真的有效,请测试以下代码:

- (void)fetchLastPhoto

    __block UIImage *latestPhoto;

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) 
    [group setAssetsFilter:[ALAssetsFilter allPhotos]];
    [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *innerStop) 
        if (alAsset)
        
            ALAssetRepresentation *representation = [alAsset defaultRepresentation];
            latestPhoto = [UIImage imageWithCGImage:[representation fullScreenImage]];
            _imageToShare = latestPhoto;
            *stop = YES; *innerStop = YES;
        

        NSLog(@"Image fetched");
    ];
 failureBlock: ^(NSError *error) 
    NSLog(@"No groups");
];


- (IBAction)buttonShare:(id)sender

    [self fetchLastPhoto];
    [self performSelector:@selector(openShareController) withObject:nil afterDelay:3.0f];


-(void)openShareController

    NSLog(@"Share controller called");
    SLComposeViewController *slComposeViewController = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
    [slComposeViewController addImage:self.imageToShare];
    [self presentViewController:slComposeViewController animated:YES completion:NULL];

【讨论】:

以上是关于在 viewDidLoad 外部调用方法时未显示相机胶卷中的最后一张图像的主要内容,如果未能解决你的问题,请参考以下文章

推送 viewController 时未调用 viewDidLoad

为自定义 UITableViewCell 加载和注册 nib 时未调用 prepareForSegue

显示关闭时未调用 didRangeBeacons 方法

Jquery datatable 在从简单的 Web 服务调用 Web 方法时未在表中显示任何数据

解除B视图时未调用UITableView函数

传递函数指针时未解析的外部符号[重复]