2010-08-30 62 views
0

我有單獨的文件爲UITableViewDataSource的UITableViewDelegateUITableViewDataSource加載完成信號到的UITableViewDelegate

我實現了「下拉刷新」功能的一個UITableView並希望從UITableViewDataSource發出信號UITableViewDelegate停止加載指示器轉動。

我想知道什麼是最好的方式發送UITableViewDataSource的UITableViewDelegate之間的信號,或是否有更好的方式來構建這個,因爲我覺得我打破了一些抽象的障礙。

我在數據源是什麼:

if([tableView.delegate respondsToSelector: @selector(dataSourceDidFinishLoadingNewData)]){ 
    [tableView.delegate dataSourceDidFinishLoadingNewData]; 
} 

,但我得到「dataSourceDidFinishLoadingNewData」在協議的警告沒有發現,因爲,我想,該功能不作爲的方法中聲明的UITableViewDelegate

+0

您是否只爲數據源和委託使用單個控制器?我不會太擔心混合兩者。它幾乎已經感覺到它們是一樣的(事實上在任何UITableViewController子類中,它們都是)。 – 2010-08-30 21:12:39

+0

在我目前的設置下,我在一個視圖控制器下有兩個UITableViews,所以我有兩個數據源和一個委託 - 所以我寧願保留單獨的文件 – 2010-08-31 01:48:45

回答

1

只是一個答案;當使用:

if([object respondsToSelector:@selector(someMethod)]){ 
    [object someMethod]; 
} 

模式,你可以用這個來代替:

if([object respondsToSelector:@selector(someMethod)]){ 
    [object performSelector:@selector(someMethod)]; 
} 

可能有點冗長,但它不會給你任何警告。

+0

好的通話,你知道這是爲什麼嗎? – 2010-08-31 01:53:42

+1

這是因爲performSelector只知道在運行時調用哪個方法。這意味着在編譯期間,它不能檢測某個消息是否在接口中列出。這是一把雙刃劍。 – 2010-08-31 02:45:55

0

在保持事物完全抽象的同時,你可以做到這一點。通過tableViews委託屬性調用委託的另一種方法是交換保留引用。但是,您甚至可以避免使用通知來通知委託人已完成加載的情況下保持對每個其他對象的引用的需要。

檢查NSNotificationCenter瞭解更多信息。

+0

雅,我認爲這是我最終會做的,謝謝。 – 2010-08-31 01:51:38

1

也許你知道,但有多個開源實現拉到刷新。你可能想在自己做之前先看看那些。這裏是一個(只是Google上的第一個):http://github.com/leah/PullToRefresh

+0

謝謝,我正在使用這個版本:http://github.com/enormego/EGOTableViewPullRefresh – 2010-08-31 01:50:20