【问题标题】:Pass scrollview delegate to child view controller将滚动视图委托传递给子视图控制器
【发布时间】:2013-08-27 19:38:05
【问题描述】:

我似乎无法弄清楚如何将滚动视图的委托设置为滚动视图中的视图控制器。

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

_scrollview.delegate = child;

我的子视图控制器正在使用滚动视图委托:

@interface ChildView : UIViewController <UIScrollViewDelegate>

但它不会调用scrollViewDidScroll;

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

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

【问题讨论】:

  • 确保 1. _scrollview 已经初始化,2. child 也已经被保留

标签: ios objective-c


【解决方案1】:

您可以通过多种方式在 Objective C 中分配属性。

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

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

为此,请在主视图控制器中创建一个属性:

@property (strong, nonatomic) ChildView * child;

然后,当您创建子视图时,将属性设置为等于它。

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

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

_scrollview.delegate = self.child;

【讨论】:

  • 需要注意的是,一旦对弱引用属性的所有强引用都被释放,该属性将被设置为 nil。分配不是这样(这曾经是在弱之前设置委托的一种相当常见的方式)
【解决方案2】:

child 在委托方法触发时被释放。

来自 UIScrollView.h:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 2021-03-12
    相关资源
    最近更新 更多