【问题标题】:Why can't I store a UIWebView's UIScrollView delegate property anymore?为什么我不能再存储 UIWebView 的 UIScrollView 委托属性了?
【发布时间】:2012-03-09 20:40:21
【问题描述】:

在 ios5 之前,我可以像这样访问 UIWebView 的 UIScrollView 委托:

for (id subview in webView1.subviews){
    if ([[subview class] isSubclassOfClass: [UIScrollView class]])  {
        UIScrollView * s = (UIScrollView*)subview;
        OldDelegate = s.delegate;//OldDelegate is type id
                    s.delegate = self;
    }
}

现在,我知道这不是正确的做法,但当时(据我所知)这是唯一的做法。 iOS 5 改变了这一点,所以我尝试使用 iOS 5 的方式:

UIScrollView * s = webView.scrollView;
Olddelegate = s.delegate;
s.delegate = self;

但无论哪种方式,我都尝试这样做,我的 OldDelegate 对象的值是 0x0。保留这个委托值真的很重要,但尽我所能,我只是得到 0x0。

有什么想法吗?

我没有使用 ARC...

【问题讨论】:

  • 只是一个问题,你有没有提交过这样的应用程序?我认为这是苹果公司禁止的。我想做类似的事情,但我不知道它是否会导致应用被拒绝。
  • 是的,它确实获得了批准,但现在是时候更新了,我无法让它工作,所以我遇到了麻烦......
  • 为什么需要保留您的代表?这证明了您构建视图层次结构的方式存在更大的问题。代表应始终声明为弱,因为保留它们没有意义。
  • 根据您描述的方式,这不一定是存储委托的问题 - 您要存储的委托值是否可见或设置在中并不完全清楚第一名。您是否直接检查了 webView.scrollview.delegate 本身以查看它是否首先设置?如果它已经是 nil,那么将它存储到 Olddelegate 就会得到 nil。

标签: iphone ios5 uiwebview uiscrollview uiscrollviewdelegate


【解决方案1】:

是的,如果您使用 arc,它可能会在您未保留的 Olddelegate 上进行垃圾收集,您可以将文件标记为不使用 -fno-objc-arc 并像您一样自行处理保留和释放习惯了。或者,您可以按照此处所述实现强引用,以帮助您保留变量。 https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

【讨论】:

  • Olddelegate 是一个属性吗? @property (nonatomic, 保留) NSObject* Olddelegate;
  • iOS 中没有垃圾回收。
【解决方案2】:

UIWebView 的scrollView 属性是UIScrollView 的子类。这个名为_UIWebViewScrollView 的私有类不使用delegate 属性,它始终为nil。也许你可以做一些重构并获得真正的滚动视图委托,但我几乎 100% 肯定苹果会拒绝你的应用程序这样做。

【讨论】:

    猜你喜欢
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2014-09-17
    • 2021-03-02
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多