2009-08-11 68 views
1

例如,您想要子類UIScrollView創建UITableView,並且您不想使用任何專用接口。爲需要使用委託的類創建子類

爲了加載單元格,您必須使用父級代理(scrollViewDidScroll,UIScrollViewDelegate)。另外,您想將一些自己的方法添加到委託中(例如tableView:willDisplayCell:forRowAtIndexPath:)。

我現在要做的是:

  1. 創建UITableViewDelegate協議延伸UIScrollViewDelegate協議。
  2. 創建UITableViewDelegateProxy,我設置爲super.delegate,在UITableViewinit

    此類符合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擴展這個類是完全透明的,面向未來的。

    然後,添加實施方案對於一些委託方法來改變默認行爲或添加一些更多的行爲(例如,呼叫在scrollViewDidScrollnexttableView:willDisplayCell:forRowAtIndexPath:)。

  3. 覆蓋delegatesetDelegate:UITableView返回並設置super.delegate.next而不是super.delegate。我也將協議從UIScrollViewDelegate更改爲UITableViewDelegate

如果UIScrollView直接通過它的ivar訪問委託,這可以正常工作。如果它使用getter,它將不會返回我們的代理,而是返回該類的用戶設置的委託。無論哪種方式,我們都不能依賴這種行爲。 (fyi:在UIScrollView中,有時經過吸氣劑,但並不總是)。

所以,如果我們留在這個例子中,問題是:我們如何才能像我們今天一樣實現UITableView,,我們自己?

+0

看到這個問題: http://stackoverflow.com/questions/11478740/shared-uitableviewdelegate – Lance 2012-07-16 18:45:01

回答

1

你不能這樣做,並保持合同,這是不幸的。 UITableView繼承自UIScrollView有些不尋常,在桌面可可一邊的東西,NSTableView不從NSScrollView繼承。

相關問題