[iOS] Table View Cell 資料傳遞

好久沒寫跟iOS相關的東西了,雖然還是一直被迫接觸Android,但也是要抽空來看一下iSO的題目才行。剛好昨天處理完一個iOS專案的bug,就順勢寫一下吧。

在TableView中按下cell進入detail view時,detail view的畫面內容通常跟你按下什麼cell有關,因此,你必須要在這兩個view之間做資料傳遞,基本上有兩種方法。為了避免我有任何疏漏,我先講我目前的作法,以及這作法跟我code之間的結果。

我透過storyboard建立segue去navigate到下一個view,因此,我可以透過segue識別碼來做傳遞。在TableView裡面按下cell做傳遞的實作有兩種:
  • tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  • prepareForSegue:(NSStoryboardSegue *)segue sender:(id)sender
差別在於,後者不僅可以處理按下cell的畫面切換,且只要使用到segue都可以進行切換,他的守備範圍更廣。下面的內容也是和它有關。

先看一下segue這個參數,他描述轉換的細節,也包含了segue所連結的前後view controllers,所以可以透過他獲得target view controller。sender則是指啟動segue的物件,比方說如果是按下cell啟動segue,則sender就可以作為該cell使用,是不是很方便?

所以雖然看起來prepareForSegue方法不好識別Cell,但其實不然。

參考代碼:



我寫了兩個方法可以獲得你所按的cell的index path,第一個就是用indexPathForSelectedRow方法,獲得選取的row的index path。第二個就是把sender當成cell,再獲得index path。所以,這樣不會太困難吧?

另外,如果你同時使用prepareForSegue和didSelectRowAtIndexPath,你應該要注意它會先呼叫prepareForSegue,所以如果你把獲取特定Cell所代表之資料的步驟寫在didSelectRowAtIndexPath,那你就會遇到大問題了。你僅須實作其中一個就夠了。

我實在不太會貼程式碼....只好直接貼圖。

留言