2010-08-09 28 views
4

我只想澄清,'設計'是指軟件設計,而不是UI設計。設計和管理類似於設置的iPhone應用程序的有效方法

我有一個類似於原生設置應用程序的應用程序。我遇到的問題是它不遵循同樣明確的MVC風格。其他應用程序傾向於關注顯示某種事物。以週期表應用爲例,它是元素。這些元素明確地包含了模型,並且它們具有相似的屬性和行爲,這意味着它們可以以相同的方式顯示和交互。像這樣的應用程序幾乎設計自己!

我的應用程序與設置應用程序一樣,由任意選擇的行以不同方式顯示不同數據組成。一行可能包含一個開關,另一行可能在模擬時呈現非常特定的視圖。他們都非常不同。

你怎麼設計這樣的東西?

目前,我做這一切在視圖控制器,以及相關的行正在通過枚舉追蹤:

enum { 
    kNameRow, 
    kGenderRow, 
    kJobTypeRow, 
    kLevelOfExerciseRow, 
    kEmailAddressRow, 
    kTelephoneNumberRow 
}; 

正如我所描述的,這些細胞都非常不同,所以顯示細胞是這樣處理的:

// - tableView:cellForRowAtIndexPath pseudocode. 

switch (indexPath.row) { 
    case kNameRow: // create name cell. 
    case kGenderRow: // create gender cell. 
    case kJobTypeRow: // create job type cell. 
    case kLevelOfExerciseRow: // create level of exercise cell. 
    case kEmailAddressRow: // create email address cell. 
    case kTelephoneNumberRow: // create telephone number cell. 
} 

並與細胞的相互作用也同樣處理:

// - tableView:didSelectRowAtIndexPath pseudocode. 

switch (indexPath.row) { 
    case kNameRow: // do name-specific stuff. 
    case kGenderRow: // do gender-specific stuff. 
    case kJobTypeRow: // do job type-specific stuff. 
    case kLevelOfExerciseRow: // do level of exercise-specific stuff. 
    case kEmailAddressRow: // do email address-specific stuff. 
    case kTelephoneNumberRow: // do telephone number-specific stuff. 
} 

這看起來非常笨重,並且在表格分解成多個部分時增加了不工作的問題。

有沒有更好的方法來做到這一點?在處理大量不相關數據的大表時,是否有任何設計模式會受益?

任何提示都非常讚賞。

回答

2

我很喜歡實現部分控制器,將邏輯拉出UITableViewController子類(或其他主機控制器),並將它們移動到自包含的類中。

我最終實現了一個基本協議,該協議定義了節控制器需要做的事情 - 對我來說,它包括節中的行數和行中的單元格(不需要整個索引路徑,因爲控制器處理單個部分)。我有可選的方法來返回節名稱和行高。這就是我迄今爲止所實現的一切,因爲這是我實際需要的。

它適用於我,因爲我的各個部分往往是同質的,但您可以輕鬆使用此想法返回同一部分內的異質單元或重構想法以使單元類型控制器代替部分控制器。最後,我的UITableViewDelegate和UITableViewDataSource方法只需要找出調用哪個節控制器,而不是嵌入UITableViewController子類中的所有邏輯。

我想我從this article得到了這個想法,但我也看到了描述相同想法的more recent article

2

你可能想看看coreyfloyds項目http://github.com/coreyfloyd/Generic-Heterogeneous-Table-Views我認爲這可能有你需要的功能。

+0

這是一些體面的代碼和一個有趣採取如何管理這樣的應用程序。不幸的是,它只支持標準的「字段」,比如文本輸入,廣播選擇列表等等。我的應用做了其他很多特定的事情,所以我不能真正使用它。我正在尋找的是設計無限可擴展應用程序的一般技巧,該應用程序以非常不同的方式處理顯示無關數據的任意數量的行。 – 2010-08-10 09:11:24

2

這是我的建議 - 將每個單元格視爲視圖的成員。

大聲笑,這已經有一段時間了,因爲我已經使用過一張桌子,所以我可能只是在這裏討論廢話,但試試看。

代替一個枚舉使用:

NSThingyCell *nameRow; 
NSThingyCell *genderRow; 

@property IBOutlet NSThingyCell *nameRow; 
@property IBOutlet NSThingyCell *genderRow; 

- (IBAction) nameRowChanged:(id)sender; 
- (IBAction) genderRowChanged:(id)sender; 

,然後,而不是與開關的表呼叫,剛絲每個單獨的小區向上在界面生成器。

這有附加的好處,因爲它是行獨立的,所以如果你必須把「ageRow」放在名字和性別之間,那什麼都不會搞砸。

這也會變得非常大,所以如果你的視圖有多個表,你可能想考慮把這些表拆分成單獨的nibs/controllers並在運行時加載視圖。

+0

你也可以看看我有一個類似的問題: http://stackoverflow.com/questions/3343702/cocoa-nstabview-coding-style-question/3346725#3346725 – 2010-08-17 12:18:31

2

你有沒有想過只爲一個包含一個UI元素和一些其他可識別數據的類的對象數組?

@interface settingsOption { 
    NSString *key; 
    UIView *displayElement; 
} 

+ (settingsOption *)optionWithKey:(NSString *)key andDisplayElement:(UIView *)displayElement; 

@property (nonatomic, retain) UIView *displayElement; 
@property (nonatomic, retain) NSString *key; 

@end 

凡類方法看起來就像

+ (settingsOption *)optionWithKey:(NSString *)key andDisplayElement:(UIView *)displayElement; 
    settingsOption *option = [[settingsOption alloc] init]; 
    option.key = key; 
    option.displayElement = displayElement; 
    return [option autorelease]; 
} 

你設置類將有settingsOption實例的數組。

- (void)somewhereInMySettingsClass 
    mySettings = [[NSMutableArray alloc] init]; 
    [mySettings addObject:[settingsOption optionWithKey:@"age" andDisplayElement:[UIButton buttonWithStyle:UIButtonStyleRect]]]; 

    [mySettings addObject:...]; 
} 

表的的cellForRowAtIndexPath只想做

[cell addSubview:[[mySettings objectAtIndex:indexPath.row] displayElement]]; 

你剛纔說的部分,不過,這將增加另一層數據。這可能只是將mySettings拆分爲數組數組而已,而數組中的每個數組都是一個部分。

不知道我是否錯過了上面的任何東西。隨意點和捅。

您可以通過爲各種類型的元素添加更多的助手類來進一步簡化settingsOption類,例如,

+ (settingsOption *)buttonWithKey:(NSString *)key; 
+ (settingsOption *)switchWithKey:(NSString *)key; 
+ (settingsOption *)pickerWithKey:(NSString *)key withDataSource:(id <UIPickerViewDataSource>)source withDelegate:(id <UIPickerViewDelegate>)delegate; 

等等等等

相關問題