比如说你想要子类
UIScrollView
创造
UITableView
,并且您不想使用任何私有接口。
要加载单元格,必须使用父级的委托(
scrollViewDidScroll
在里面
UIScrollViewDelegate
)另外,您希望向委托添加一些自己的方法(例如
tableView:willDisplayCell:forRowAtIndexPath:
)
我现在要做的是:
-
创造
UITableViewDelegate
扩展的协议
滚动视图委托
协议。
-
创造
UITableViewDelegateProxy
,我设置为
super.delegate
在
UITababVIEW
的
init
.
这个等级符合
滚动视图委托
并且有一个
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];
}
所以到目前为止,这个类是完全透明的,并且是未来的证明
滚动视图委托
扩展。
然后,我为一些委托方法添加实现,以更改默认行为或添加更多行为(例如,调用
下一个
的
表视图:将显示单元格:ForRowatindexPath:
在里面
滚动查看滚动
)
-
重写
delegate
和
setDelegate:
在里面
UITababVIEW
返回并设置
super.delegate.next
而不是
超级代表
. 我还将协议从
滚动视图委托
到
委托协议
.
如果可以的话
UISCLVIEW
正在通过其IVAR直接访问代理。如果它使用getter,它不会返回我们的代理,而是返回由类的用户设置的代理。不管怎样,我们不能依赖这种行为。(仅供参考:
UISCLVIEW
它有时会通过吸气剂,但并不总是如此)。
因此,如果我们继续使用这个例子,问题是:
我们如何实现UITableView,
和今天一样
我们自己?