在 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