2011-03-14 46 views
1

如何從子類別UITableViewCell內訪問UITableViewController參數?如何從子類化的UITableViewCell中訪問UITableViewController變量?

我在UITableViewController中有一個字體大小的參數(即用戶可以更改字體大小)。因此,在我自定義子類UITableViewCell中的layoutSubviews方法需要訪問最新的字體,因爲它需要自行重新佈局(因爲它的標籤位置取決於字體)。

所以我的問題,從我的自定義子類UITableViewCell,具體內layoutSubviews方法,我怎麼訪問「uiFont」參數,它是從UITableViewController一個實例變量?

回答

2

從單元內訪問UITableViewController對象在設計方面不是一個好方法。你應該做的是建立在表格單元格本身伊娃存儲UIFont對象:

@interface CustomCell : UITableViewCell { 
    UIFont *font; 
} 
@property (nonatomic, retain) UIFont *font; 

,然後在tableView:cellForRowAtIndexPath方法,設置單元格字體:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ... 
    [cell setFont:uiFont]; 
    ... 
} 
+0

哦,是的,我明白你的意思indragie - 將改變我的方法 - 謝謝 – Greg 2011-03-14 01:34:56

+0

哦實際上如果用戶通過工具欄更改字體大小而不滾動tableview?這是不是意味着「cellForRowAtIndexPath」可能不會被觸發?如果是的話,問題是如何(a)啓動佈局視圖回調,(b)在layoutViews中獲取新版本的字體? – Greg 2011-03-14 01:44:02

+0

當用戶改變字體時,只需調用[tableView reloadData]。這將調用cellForRowAtIndexPath並更新字體。 – indragie 2011-03-14 01:55:25

4

有有幾種方法:通過應用程序委託上的屬性訪問UITableViewController(您可以從任何地方使用[UIApplication sharedApplication].delegate訪問該屬性),當您在tableView:cellForRowAtIndexPath:中創建UITableViewController時,給單元格引用UITableViewController,或者按照UIResponder鏈中的UIResponder鏈單元格視圖,直到找到UITableViewControlle河

但實際上,這可能是一個糟糕的架構。您應該在表視圖上調用reloadData以使其重新創建所有單元格,並將字體設置爲tableView:cellForRowAtIndexPath:。或者如果字體設置應該保留,您可以將其存儲在NSUserDefaults中,並讓單元偵聽NSUserDefaultsDidChangeNotification

+0

我想知道reloadData調用,並認爲它可能是矯枉過正 - 但考慮到我只是想到這種情況也許這是最好的方法。方案是:如果用戶通過工具欄更改字體大小而不滾動tableview會怎麼樣?這是不是意味着「cellForRowAtIndexPath」可能不會被觸發?如果是的話,問題是如何(a)啓動佈局視圖回調,(b)在layoutViews中獲取新版本的字體? – Greg 2011-03-14 01:45:47

+0

這意味着'cellForRowAtIndexPath'不會被觸發。更糟糕的是,如果他們緩慢滾動,他們可能會在屏幕上顯示一半的舊字體,一半顯示新的字體。你通過發送'setNeedsLayout'來告訴視圖放置。 – Anomie 2011-03-14 01:49:17

+0

好吧,基於這個和來自indragie的建議,好像是[tableView reloadData]是按順序的,或者至少是在setNeedsLayout的最小值 - 謝謝你的幫助 – Greg 2011-03-14 02:02:41