2016-04-18 79 views
0

我發現真的很奇怪,或者是一個糟糕的設計決定,UIPickerViewDelegate包含需要了解其數據(標題)的方法。因爲這將是其DataSource的全部目的。像這些:UIPickerView DataSource x委託設計

pickerView(_:titleForRow:forComponent:) 
pickerView(_:attributedTitleForRow:forComponent:) 
pickerView(_:viewForRow:forComponent:reusingView:) 

我想要實現與不同對象PickerViewDataSourceDelegate。當然,創建一個新的代表很容易,可以稱之爲PickerViewListenerDelegate。但是,當蘋果做出這個設計決定時,我認爲首先值得討論。

這個奇怪的設計決定的重點是什麼?我在這裏錯過了什麼嗎?

回答

0

UIPickerViewDataSource協議只處理數據源的直接屬性,即每個組件的數量和行數。

UIPickerViewDelegate協議地址介紹。它提供尺寸,標題或視圖,以及選擇更改的回調。

如果我們將其與UITableViewDataSourceUITableViewDelegate進行比較,奇怪的模式是完全不同的。

通常,delegatedataSource都會連線到同一個對象,即視圖控制器,它將調用路由到底層模型並構建所需的UI元素。我個人認爲,將dataSource連接到數據模型,但委託給控制器 - 做出了一個奇怪的決定,可以輕鬆地破壞封裝。

所以基本上這意味着:是的,您可以使用給定的模式在模型和表示(即格式化程序)之間分開。如果你覺得它有用,取決於你。

+0

就像Table Views一樣,我經常使用與DataSource和Delegate相同的Controller對象。然而,正如我所看到的那樣,它們有兩個不同的屬性是有原因的,這一次它對於我的設計使用兩個不同的對象是有意義的,但是'UIPickerViewDataSource'和'UIPickerViewDelegate'的奇怪設計阻止了我這樣做。 (我不得不以奇怪的方式將它們連接起來,這樣'委託人'就知道標題。 –