2016-04-26 221 views
1

根據indexPath.row更改didSelectRowAtIndexPath操作的最佳方式是什麼?didSelectRowAtIndexpath嵌套if語句

例如,5行讓我有這樣的事情:讓它不是didSelectRowAtIndexPath方法方法中:

switch indexPath.row { 
case 0: 
    if offlineMode { 
    // do this 
    } else { 
    // do something else 
    } 
case 1: 
    if offlineMode { 
    // do this 
    } else { 
    // do something else 
    } 
case 2: 
    if offlineMode { 
    // do this 
    } else { 
    // do something else 
    } 
case 3: 
    if offlineMode { 
    // do this 
    } else { 
    // do something else 
    } 
case 4: 
    if offlineMode { 
    // do this 
    } else { 
    // do something else 
    } 
default: 
    // default behaviour 
} 

所以,我可以將此代碼分成doActionOnSelect(NSIndexPath indexPath)。

但是,我可以在這裏看到很多重複的代碼。這正是我想盡量減少的。

這個問題更多的是關於MVC,責任和從根本上構建我的代碼的方式。

+1

目前還不清楚是否所有「做這個」都做同樣的事情。如果是這種情況,可以縮短代碼 –

+0

請詳細說明「請執行此操作」 – luiyezheng

+0

對不起,它們實際上是不同的。 //做這個1,//做這個2 –

回答

1

這是所有高級別和泛化,但希望有所幫助。

重構該代碼的一種方法是將您的數據/狀態(可能由該大開關語句表示的內容)放入其他對象中,例如「模型」,並使用段/行輸入查詢該模型並返回預期的輸出:也許是某種類型的單元格。或者可能是另一個專門爲您需要創建的單元的模型對象。

另一個重構是使用enum來定義您的「模式」,並在switch語句中使用它,以及在表視圖部分和行中備份數據。由於enum在Swift中是詳盡無遺的,因此您可以消除令人困惑的default:大小寫。

另一種方法可能是通過模型對象來表示每個單元格的狀態。將數據提供給模型對象,然後在創建時將模型對象傳遞給單元格。

無論如何,有很多方法對皮膚這隻貓:

https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=Refactor+table+view

0

一個簡單的方法來擺脫你的if/else語句的是創建一個功能offlineDidSelectRowAtIndexPath實現開關罩。

方法如下:你會

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    guard offlineMode != true else { 
    offlineDidSelectRowAtIndexPath(tableview, didSelectRowAtIndexPath: indexPath) 
    return 
    } 

    switch indexPath.row { 
    case 0: 
    // do something else 1 
    case 1: 
    // do something else 2 
    case 2: 
    // do something else 3 
    case 3: 
    // do something else 4 
    case 4: 
    // do something else 5 
    default: 
    // default online and/or offline behaviour 
} 

,並有一個函數

func offlineDidSelectRowAtIndexPath(tableView: UITableView, indexPath: NSIndexPath) { 

    switch indexPath.row { 
    case 0: 
     // do this 1 
    case 1: 
     // do this 2 
    case 2: 
     // do this 3 
    case 3: 
     // do this 4 
    case 4: 
     // do this 5 
    default: 
     // default behaviour 
    } 
} 

注意:有可能比我的回答更簡單/容易/更好的方法。 (另外,不要忘記break語句)。