2013-08-25 42 views
2

我似乎无法弄清楚如何在scrollview中将scrollview的委托设置为viewcontroller。将scrollview委托传递给子视图控制器

ChildView *child = [[ChildView alloc] init]; 

_scrollview.delegate = child; 

我的孩子视图控制器使用滚动视图代表:

@interface ChildView : UIViewController <UIScrollViewDelegate> 

但它不会调用scrollViewDidScroll;

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
NSLog(@"%f", scrollView.contentOffset.y); 
} 

基本上,我想将scrollview的scrollview偏移量传递给嵌套在其中的视图控制器。

+0

确保1. _scrollview已经初始化,2.孩子一直保留以及 – Andrew

回答

3

有几种方法,你可以在目标C.分配财产

  1. 分配意味着简单地执行变量赋值,并设置一个变量等于另一个。如果超出范围,您将无法使用该变量。这通常只用于C原语。
  2. Weak告诉编译器只要其他人强烈指向该对象就保持对该对象的引用。
  3. 告诉编译器保持对给定对象的强引用。这意味着对象不会超出范围,直到持有该对象的对象超出范围。

正如@Aaron指出的,代表属性是使用assign设置的。这意味着如果您设置委托的变量超出范围,则引用将变为无效。为了解决这个问题,你必须保持一个指向周围物体的强指针,以便它不会超出范围。

要做到这一点,在您的主视图控制器创建一个属性:

@property (strong, nonatomic) ChildView * child; 

然后,当你创建子视图,设置属性等于它。

self.child = ChildView *child = [[ChildView alloc] init]; 

现在您可以设置委托,并且一旦函数终止,它就不会超出范围。

​​
+2

有一点要注意的是,一旦被释放的财产,以弱引用属性的所有强引用将被设为零。分配方式并不如此(过去,这是一种相当常见的方式来在弱方面设置代表) – powerj1984

1

child在委托方法触发时正在取消分配。

从UIScrollView.h:

@property(nonatomic,assign) id<UIScrollViewDelegate> delegate; // default nil. weak reference 

这是一个弱引用,所以它不会被保留。要修复它,请在主视图控制器中创建一个strong @property,并将其设置为child

相关问题