2014-11-24 72 views
0

在兩個視圖控制器之間傳遞數據似乎已經使用委託來解決。我的情況有點不同,既然我是新人,我不知道我能否與代表解決。iOS:將數據從ChildViewController傳遞給GrandParentViewController?

我有3個視圖控制器。 GrandParentParentChild
GrandParent實例化Parent顯示列表CategoryGroups
點擊CategoryGroup實例化Child視圖控制器顯示Categories的列表。

我希望當用戶點擊任何Category時,GrandParent會得知被點擊的Category

我現在擁有什麼?

Child.h視圖控制器

@protocol CategorySelectDelegate<NSObject> 
- (void) categorySelected:(CategoryModel *) categoryModel; 
@end 

Child.m視圖控制器

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"selected category:%@", _categories[(NSUInteger) indexPath.row]); 
    [self.delegate categorySelected:_categories[(NSUInteger) indexPath.row]]; 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

GrandParent.h

@interface GrandParent : UIViewController<CategorySelectDelegate> 

GrandParent.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    ChildViewController *categoryViewController = [[ChildViewController alloc] init]; 
    childViewController.delegate = self; 
} 

- (void)categorySelected:(CategoryModel *)categoryModel { 
    _categoryLabel.text = categoryModel.name; 
    NSLog(@"categoryLabel:%@", _categoryLabel.text); 
} 

但我知道這是不正確,因爲GrandParent的一個直接實例Child,它始終是父母誰生下Child

問題
- 如何通過categoryModelChildGrandParent
- 一般來說,我如何將數據從一個子控制器傳遞迴任何祖先控制器?

UPDATE

現在,我已經添加了2名代表來解決這個問題
一)從ChildParent
b 1名代表。)1名代表從ParentGrandParent
這工作,但我不認爲這是一個好的設計,數據需要在兩個或更多的視圖控制器之間傳遞,因爲最終會創建新的代理來傳遞值。

+0

那麼,我使用委託在vcs之間傳遞這種數據。但我也使用CoreData或NSUser在vcs之間共享一些其他數據。 – leonard 2014-11-24 03:44:37

回答

0

有趣的問題,你有。

您可以建立一套可以被任何對象認購的全球協議,並通過周圍的人誰收到郵件。這可以作爲建立一個單獨的.h

那麼容易,因爲父母建立孩子,父母必須提出的是子視圖控制器之前設置grandparent.delegate =小孩。

然後,當然當孩子被刪除,父母再次顯示,委託需要被設置回來。

0

如果您想使用委託,那麼除了將GrandParent作爲委託傳播給Child,以便在選擇類別時可以將回調發送到GrandParent。

或者,您可以發佈NSNotification從子選擇類別時,並添加GrandParent作爲觀察員來獲取通知。

1

我或多或少相同的使用情況,以及我寧願去與通知,因爲它似乎是鬆耦合對象,

使代表只是爲了交換數據​​不會是一個不錯的選擇。

請參考How Best to Use Delegates and Notifications它說,

通知結果中的對象之間的鬆耦合。耦合是鬆散的,因爲發送通知的對象不知道什麼在收聽通知。 T 他的鬆耦合可以是非常強大的,因爲多個對象都可以註冊以聽相同的通知 因此,在其他視圖控制器或任何其他小部件想要處理數據的情況下,可以輕鬆實現,無需設置更多的代表。

但此行也保持良好

該通知和代表提供這樣的不同的耦合是它們應該在不同的情形中使用的指示器的事實。如果表視圖使用通知而不是委託,則所有使用表視圖的類都可以爲每個通知選擇不同的方法名稱。這會讓你很難理解代碼,因爲你需要去查找通知註冊來確定調用哪個方法。使用委託,顯而易見的是:所有使用表視圖的類都將以相同的方式強制執行。