2014-12-31 58 views
1

例如我想爲不同的屏幕尺寸設置不同的單元格高度。在一個UITableView數據源的方法:是否有一種簡單的方法在循環/重複運行方法中只賦值一次(第一次)?

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    defaultHeight = self.view.frame.size.height > 480 ? 38 : 32; 
    // how to let something like the right side of the = run just once? 

    if (indexPath.row == 0) {// no need to remove. 
     ...// do something 
     return 20; 
    }else { 
     ...// do something else 
     return defaultHeight; 
    } 
} 

是否有一個通用的機制來分配defaultHeight只有一次,而無需添加額外的「如果其他人」(只是想知道有沒有一些方法,我錯過了)?並且在反覆調用的方法內部保持代碼結構簡單易行,並且不需要在什麼時候初始化。

+0

「if else」有什麼問題?如果清楚代碼是如何工作的,那很好。僅僅減少代碼行數是沒有好處的,尤其是以犧牲清晰度爲代價。如果您試圖使方法更快:不要,至少在性能問題出現之前,通過分析您知道這是一個問題。 – zaph

+0

你說這個循環在哪裏? – rmaddy

+0

@rmaddy我應該說反覆調用的方法。 – Al3n

回答

0

是,iOS設備提供了一種方法來做到這一點 - 使用dispatch_once功能,並提供了執行塊初始化:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     defaultHeight = self.view.frame.size.height > 480 ? 38 : 32; 
    }); 
    return indexPath.row == 0 ? 20 : defaultHeight; 
} 

的iOS保證該塊將僅依賴於最初通過函數調用執行。

+1

但是,這是在清晰度和/或性能方面的改進? – zaph

+0

@Zaph這是由OP來決定 - 我的意思是我的猜測和其他人一樣好。就個人而言,如果僅僅出於性能原因,我不會打擾這種方法,但我不確定,因爲'defaultHeight'可能可以從別處設置。 – dasblinkenlight

+0

@dasblinkenlight我知道它可以從其他地方設置,只是想知道是否有可能把它放在裏面,不要重複做同樣的事情。 – Al3n

0

我想你是在談論一些條件運算符。條件運算符是取代長條件的最簡單方法。嘗試這個!

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
    return (!indexPath.row)?20:(self.view.frame.size.height > 480)? 38 : 32; 
    } 
+0

我的不好,不是要刪除現有的「如果eles」。更新了問題。 – Al3n

相關問題