2014-03-05 26 views
0

我有一個NIB包含一個充當導航視圖的UIView和一個UITableView。 NIB將UITableViewController作爲其所有者。清潔UITableViewCell&UIViewController的開發模式

我想保持我的擔憂分離:我的細胞將全部管理他們自己的更深層次的相互作用,但是如果我想提出一個UIImagePickerController,我需要使用UIViewController這樣做。

我的理解傳統上認爲代表團是這個品牌架構的最佳選擇,但我的UITableView類管理着單元格的表現,他們自己管理他們自己的交互。所以,我委託給tableview(這不是一個viewcontroller),委託給UIViewController?我該如何做這樣的事情,這是最不可能的?

回答

1

所以,我解決了這個問題。發現一個好方法是這樣的:

1)該單元格將有一個協議。該協議將包含表示駐留視圖控制器希望的方法。更具體地:

/* .h file of cell */ 
@protocol LoItemViewCellDelegate <NSObject> 

@optional 
- (void)cell:(LoItemViewCell *)cell wantsToPresentViewController:(id)viewController; 
- (void)cell:(LoItemViewCell *)cell wantsToPresentActionSheet:(UIActionSheet *)actionSheet; 

@end 

2)細胞必須經由其代表直接訪問的視圖控制器。否則,你會創建一個三明治邏輯,將變得不守規矩。 (如cellview-> tableview->視圖 - 控制)

3)然後調用這個方法在你的,無論你需要它叫做:

/* Inside some method in cell .m */ 
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; 
imagePicker.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:sourceType]; 
imagePicker.delegate = self; 

[self.delegate cell:self wantsToPresentViewController:imagePicker]; 

4)您的委託是那麼自由地實現在任何這些方法它希望的方式。

/* Delegate view controller */ 
- (void)cell:(LoItemViewCell *)cell wantsToPresentViewController:(id)viewController 
{ 
    [self presentViewController:viewController animated:YES completion:nil]; 
} 

這樣,你只沿東西細胞根本無法處理本身傳遞,而其他內容(控制邏輯等)保持與細胞。因此,舉個例子,在這個例子中,我將一個UIImagePickerController傳遞給我的委託,只是顯示,而我正在對我的單元內部的那個控制器進行所有的管理,因爲我的單元是唯一顯式的代碼片段給了一個該死的選擇器想要做的事情。

非常乾淨,我非常推薦這種方法。