2016-03-05 63 views
1

我有一個UITableViewUITableViewController,我在我的應用程序中使用多個屏幕。堆棧兩個UITableViews

我最近與我的組織的產品團隊交談過,他們要求對於其中一個屏幕,我預留了大約15個單元,其外觀和功能差別很大

圍繞谷歌搜索後,似乎要做到這一點的唯一方法是對每個實施UITableViewDelegate法類似複雜:

if section == 0 { 
    ... 
} 
if section == 1 { 
    ... 
} 

我並不想這樣做,因爲其他的屏幕,顯示這張表,不需要這個邏輯,突然重複使用變得更加複雜。

理想情況下,我想要的是垂直堆疊兩個表視圖,這樣一個附加到另一個的底部。

我的架構出了什麼問題,還是在IOS中沒有好的方法?

+0

Subclass current one then put these code in? –

回答

0

@Fennelouski,非常感謝你對你的提示,我居然結束了你的不推薦的第4個選項會:

放入容器視圖

主要的原因既表視圖我朝這個方向前進是因爲在過去,當試圖將滾動視圖放入其他滾動視圖時,我發現了有關彈跳的意外行爲。即使我在嵌套滾動視圖上將bounces設置爲false,我發現當使用嵌套滾動視圖開始拖動時,父滾動視圖不會在其內容結束時移動。

我的解決方案並沒有太糟糕(部分原因是我的應用程序是用我設計的框架構建的,它允許漂亮的事件發生)。我會在這裏概括它:

  1. 兩個表,firstsecond添加到一個UIView,container由一個UIViewController,controller控制。
  2. 將兩個表的大小設置爲container的大小。
  3. 設置first.contentInset.bottomsecond.contentSize.height並設置second.contentInset.top等於first.contentSize.height(這是一定要做,以允許輕彈一個表夠硬,打其他表的末尾..而且必須再次隨時隨地做任何的改變表高度)
  4. 設置second.backgroundColorclear
  5. 定義second的則hitTest方法pointInside:withEvent:return point.y > 0(做到這一點,所以在上面second空白處的觸摸事件將轉化到first
  6. 當任一表的委託方法調用,存儲哪個表開始拖動(我用了一個名爲last_dragged的屬性)。
  7. 當任一表的委託方法scrollViewDidScroll:被調用時,定位表不是last_dragged基於該表的偏移last_dragged

這是我使用的代碼對於controller(這是的,是寫在紅寶石,但希望你可以閱讀它作爲sudo代碼)

def load_view 
    content.add_subview first, size: content.size 
    content.add_subview second, size: content.size 
    set_content_offsets 
    listen_for_events 
    set_second_y 
end 

def set_content_offsets 
    first.content_inset_bottom = second.content_size_height 
    second.content_inset_top = first.content_size_height 
end 

def listen_for_events 
    listen_to_first 
    listen_to_second 
end 

def listen_to_first 
    first.on('refresh', method(:set_content_offsets)) 
    first.on('begin_drag', method(:second_dragged)) 
    first.on('scroll', method(:scroll)) 
end 

def listen_to_second 
    second.on('refresh', method(:set_content_offsets)) 
    second.on('begin_drag', method(:second_dragged)) 
    second.on('scroll', method(:scroll)) 
end 

def first_dragged 
    @last_dragged = :first 
end 

def second_dragged 
    @last_dragged = :second 
end 

def scroll 
    if @last_dragged == :first 
    set_second_y 
    else 
    set_first_y 
    end 
end 

def set_first_y 
    first.content_offset_y = 
    first.content_size_height + 
    second.content_offset_y 
end 

def set_second_y 
    second.content_offset_y = 
    first.content_offset_y - 
    first.content_size_height 
end 
3

我不得不做類似的事情了幾個不同的時代,這裏是我剩下什麼:

  1. 添加基於部分特殊情況。令人驚訝的是,我發現這是最容易閱讀和維護的。只需使用靜態和清除變量名稱而不是if (section == 0)

  2. 爲行0創建一個包含表視圖的特殊單元格。這不是最簡單的事情,但它可以很好地工作,以便能夠將代碼分解爲多個文件,這些文件通常更適合維護。當你對委託方法進行排序時,這確實會變成一件痛苦的事情,但一旦解決了,那麼它就是一個非常動態的解決方案。

  3. 如果您沒有使用標題,那麼請執行與#2相同的操作,但對您的特例使用標題。當規範發生變化時,這可以很好地工作(如果可用),因爲您可以將視圖放在不同的頁眉或頁腳中。

  4. 將兩個表視圖放在某種容器視圖中。我試過這個,它不漂亮。我不推薦。

  5. 將這兩個表添加到另一個表中。這可以用來分配細胞來自哪裏。這樣做,您可以繼承UITableView,並創建一個標誌將特殊表添加到表中。這不僅僅是一個建議和一個起點的解決方案。

無論您選擇哪個選項,請確保它清晰可辨。當你不在腦海中時,UITableView會變得複雜。

+0

非常感謝您的提示,我已經添加了關於我最終做了什麼的詳細答案。我很想知道是否存在您列出的其他選項之一的實現,它不會遇到我在下面描述的嵌套的scrollview問題。 – BananaNeil

+0

我很高興你能解決這個問題。選項1在彈跳或異常行爲方面沒有任何問題,但那是因爲它只是一個表視圖。對於選項2和3,我將採用較小的表格視圖並禁用滾動,同時使單元格變爲表格視圖的大小,這樣只有一個表格視圖正在滾動。如果這個表格視圖不是特別大,那麼它工作得很好。 – Fennelouski