gpt4 book ai didi

objective-c - 子类化一个类,同时需要使用委托(delegate)

转载 作者:行者123 更新时间:2023-12-03 17:18:08 25 4
gpt4 key购买 nike

例如,您想要子类化 UIScrollView 来创建 UITableView,并且您不想使用任何私有(private)接口(interface)。

为了加载单元格,您必须使用父级的委托(delegate)(UIScrollViewDelegate 中的scrollViewDidScroll)。另外,您想要向委托(delegate)添加一些您自己的方法(例如 tableView:willDisplayCell:forRowAtIndexPath:)。

我现在做的是:

  1. 创建扩展 UIScrollViewDelegate 协议(protocol)的 UITableViewDelegate 协议(protocol)。
  2. UITableViewinit中创建UITableViewDelegateProxy,我将其设置为super.delegate .

    此类符合 UIScrollViewDelegate 并具有 next 属性,该属性可能引用符合 UITableViewDelegate 的对象.

    默认情况下,它尝试使用自己的实现进行响应。如果该方法不可用,它将尝试 next 的实现,否则不会响应。

    - (BOOL)respondsToSelector:(SEL)aSelector
    {
    if ([super respondsToSelector:aSelector])
    return YES;
    else if (self.next)
    return [self.next respondsToSelector:aSelector];
    else
    return NO;
    }

    - (void)forwardInvocation:(NSInvocation *)anInvocation
    {
    // self did not respond to selector
    if (self.next)
    [anInvocation invokeWithTarget:self.next];
    else
    [self doesNotRecognizeSelector:anInvocation.selector];
    }

    所以到目前为止,如果扩展 UIScrollViewDelegate,这个类是完全透明且面向 future 的。

    然后,我添加一些委托(delegate)方法的实现,以更改默认行为或添加更多行为(例如,调用 nexttableView:willDisplayCell:forRowAtIndexPath: scrollViewDidScroll)。

  3. UITableView 中重写 delegatesetDelegate: 以返回并设置 super.delegate.next而不是 super.delegate。我还将协议(protocol)从 UIScrollViewDelegate 更改为 UITableViewDelegate

如果 UIScrollView 直接通过 ivar 访问委托(delegate),则此方法可以正常工作。如果它使用 getter,它不会返回我们的代理,而是返回类的用户设置的委托(delegate)。不管怎样,我们不能依赖这种行为。 (仅供引用:在 UIScrollView 中,它有时会通过 getter,但并非总是如此)。

因此,如果我们继续看这个例子,问题是:我们如何实现 UITableView,就像现在这样,我们自己?

最佳答案

您无法做到这一点并保留契约(Contract),这是不幸的。 UITableView 继承自 UIScrollView 有点不寻常;在桌面 Cocoa 方面,NSTableView 并不继承于 NSScrollView

关于objective-c - 子类化一个类,同时需要使用委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1259066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com