2013-08-25 101 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

相關問題