关于block回调函数中调用,本类变量的问题,该变量在代码体之外。(结贴,感谢大家支持,在指点下解决代码问题了) - OurCoders (我们程序员)

OC

关于block回调函数中调用,本类变量的问题,该变量在代码体之外。(结贴,感谢大家支持,在指点下解决代码问题了)

shifeng310 发布于 2014年09月12日 | 更新于 2014年09月15日
无人欣赏。

我想实现的是一个UIScrollView动态加载照片的程序,使用的是SDImageManager开源代码来实现图片的下载和缓存的使用; 在block做为参数的回调函数中一张一张添加图片UIImageView到 Scrollview上

 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
 if (image) {
 imageview = [[UIImageView alloc] initWithFrame:CGRectMake(scrollview.frame.size.width*i, 10.0,scrollview.frame.size.width, scrollview.frame.size.height-20)];
 imageview.image = image;
 [scrollview addSubview:imageview];
 }
 }];

在block代码体里面,可以打印看到UIImageview 都添加到了ScrollView上了。但是在block代码体外访问ScrollView里面的子视图都是空的,并有没添加任何ImageView. 而且scrollview的delegate方法都失效了,目前不知道什么原因,请各位老师指点,指教。下面附上.m的实现代码 谢谢!

@implementation AlbumScroll
-(void)setArrOfImages:(NSMutableArray *)arr
{
mm= 80;
scrollview = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 30, 734, 550)];
scrollview.contentSize = CGSizeMake((scrollview.frame.size.width+10)*([arrOfImages count])+10, scrollview.frame.size.height);
//用它指定 ScrollView 中内容的当前位置,即相对于 ScrollView 的左上顶点的偏移
scrollview.contentOffset = CGPointMake(0, 0);
//按页滚动,总是一次一个宽度,或一个高度单位的滚动
scrollview.pagingEnabled = YES;
[scrollview setDelegate:self];
scrollview.scrollEnabled = YES;
scrollview.showsVerticalScrollIndicator = NO;
scrollview.showsHorizontalScrollIndicator = YES;
[self addSubview:scrollview];
arrOfImages = arr;
CLog(@"arrofimages is %@",arrOfImages);
//配置每一张imageView 图片,并添加到scrollview
SDWebImageManager *manager = [SDWebImageManager sharedManager];
for (int i =0; i<arrOfImages.count ; i++) {
 NSString *picturePath = [arrOfImages objectAtIndex:i];
 NSURL *imageUrl = [NSURL URLWithString:picturePath];
 [manager
 downloadImageWithURL:imageUrl
 options:0
 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
 }
 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
 if (image) {
 imageview = [[UIImageView alloc] initWithFrame:CGRectMake(scrollview.frame.size.width*i, 10.0,scrollview.frame.size.width, scrollview.frame.size.height-20)];
 imageview.image = image;
 [scrollview addSubview:imageview];
 }
 }];
}
pageControl = [[UIPageControl alloc] init];
pageControl.frame = CGRectMake(336,620, 122, 36);
pageControl.numberOfPages = arrOfImages.count;
pageControl.currentPage = 0;
[pageControl addTarget:self
 action:@selector(pageTurn:)forControlEvents:UIControlEventValueChanged];
[self addSubview:pageControl];
CLog(@"scrollview.subviews is %@",scrollview.subviews);
}
@end
共17条回复
shifeng310 回复于 2014年09月12日

希望指点,胖胖叔

liyinkan 回复于 2014年09月12日

额,对 OC 不是很懂,帮你顶上去......

cheng.seattle 回复于 2014年09月13日

ScrollView显示图片... 为什么听起来就是UICollectionView......

qianshijia 回复于 2014年09月13日

图片是异步加载的啊,当你CLog(@"scrollview.subviews is %@",scrollview.subviews);的时候图片还没有完成加载,所以subviews是空

shifeng310 回复于 2014年09月13日

4楼 @qianshijia 感谢你的提示,刚打断点看了确实是先执行CLog(@"scrollview.subviews is %@",scrollview.subviews); 后才执行complete 中的block回调函数,所以导致scrollview的子视图是空的。

请问有什么方法解决这个问题吗? 我在block回调中一张一张增加scrollview 的图片,然后在block代码体外能使用,能滑动?

shifeng310 回复于 2014年09月13日

2楼 @liyinkan 谢谢回复

shifeng310 回复于 2014年09月13日

3楼 @cheng.seattle 都是容器类的viewcontroller吧,scrollview可滑动放大缩小

qianshijia 回复于 2014年09月15日

5楼 @shifeng310 在图片加载之前,根据图片的数量设置scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * i, scrollView.frame.size.height),然后在每一页上放一个placeholder,图片加载完成后替换这个placeholder

ruandao 回复于 2014年09月15日

我猜,你想要的是

dispatch_async(dispatch_get_main_queue(), ^{
});

========

仔细看了下, 好像不是

嗯, 你可以写个方法,放到block 里面进行调用

因为block 的调用是要等图片下载完成的

callmewhy 回复于 2014年09月15日

completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {这个是一个回调用的block,意思就是说,当我加载完了,我就调用里面的block,所以你在后面直接加上打印室不可以出来的。

就像是你告诉一个服务员,帮我来一份糖醋里脊,然后他刚去准备菜的时候你立即就问,准备好了吗?你说人家怎么可能准备的好。

解决方案有很多,你可以直接把内容写到 block里面,也可以把block后面的一坨代码,封装到一个方法里,比如setupView之类的,然后在 block 的结尾调用这个方法进行初始化。

本帖有17个回复,因为您没有注册或者登录本站,所以,只能看到本帖的10条回复。如果想看到全部回复,请注册或者登录本站。

登录 或者 注册
发布新帖
相关帖子
相关新闻
最新帖子

AltStyle によって変換されたページ (->オリジナル) /