关于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 的结尾调用这个方法进行初始化。

Phil 回复于 2014年09月15日

block里面还没结束,在block外面的就还没有赋值,所以是空的

adad184 回复于 2014年09月15日

是我 我就先把所有的imageView都添加到scrollview上 再逐个调用sd_setImageWithURL

shifeng310 回复于 2014年09月15日

10楼 @callmewhy 非常感谢你的热心回复,代码的问题在你的点拨下弄清楚了,也就是作用域的问题,解决方法也是你提供的方式,在block的代码体里面,调用一个封装好的方法,该方法里设置了下scrollview的属性。代码就能正确运行,一张张读取网络图片了,非常感谢,能不能加个联系方式,偶尔线上交流交流啊

callmewhy 回复于 2014年09月15日

13楼 @shifeng310 QQ 694175346,或者邮箱 whywanghai#gmail.com ^_^

shifeng310 回复于 2014年09月15日

12楼 @adad184 恩,这个方法也可以,sd_setImageWithURL 这个我一般用在tableview里面读cell的image

shifeng310 回复于 2014年09月15日

11楼 @Phil 正解,问题已经解决,感谢大家指点

shifeng310 回复于 2014年09月15日

9楼 @ruandao 是的,没错,就是作用域的问题,在block里面写个方法调用就完事了,自己大意不注意。

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

登录 或者 注册
相关帖子

[顶 楼]
|
|
[底 楼]
|
|
[首 页]