2014-02-11 38 views
0

我有一個視圖控制器A(作爲文本框的inputView)的選擇器視圖。 爲了讓用戶能夠選擇一個新的值(一個不是pickerview的一行),還有一個按鈕,它以模態方式呈現另一個視圖控制器B,用戶可以在其中創建一個新值。關閉後,我希望textfield和它的inputView pickerView用新值更新。 我的pickerview由CoreData的NSArray支持。不幸的是,當我關閉視圖控制器B時,雖然新值在覈心數據中更新,但pickerview並未更新。更新pickerView在前一個視圖控制器時關閉模式視圖控制器

我該如何做到這一點?

回答

1

其中一個很好的解決方案是實現委託模式(可可一個共同的模式):

在ViewControllerB.h聲明一個ViewControllerBDelegate協議。 然後在你的ViewControllerB接口中添加一個委託爲伊娃。

//ViewControllerB.h 

@class ViewControllerB; 
@protocol ViewControllerBDelegate <NSObject> 
@required 
- (void)viewControllerB:(ViewControllerB *)controller didChangeValueTo:(NSString *)value; 
@end 

@interface ViewControllerB : UIViewController 
@property (weak, nonatomic) id<ViewControllerB> delegate; 
[...] 

然後當值已改變(或當用戶確認更改)的事件發送到代理這樣的:

if ([self.delegate respondsToSelector:@selector(viewControllerB:didChangeValueTo:)]) 
{ 
    [self.delegate viewControllerB:self didChangeToValue:newValue]; 
} 

在ViewControllerA只是做

ViewControllerB *viewController = [...]; //initialization 
[viewController setDelegate:self]; 

和添加方法:

- (void)viewControllerB:(ViewControllerB *)controller didChangeValueTo:(NSString *)value 
{ 
[...];//your stuff here 
} 
+1

Tx @France scu,我想你們是「靠書」的正確方式。我使用了簡化版本,因爲我已經有ViewControllerA作爲ViewControllerB的委託。我更新了NSArray,它在viewWillAppear中存儲了pickerview的Core Data對象,重新加載了選擇器視圖,但沒有聲明它是一個協議,因爲我不熟悉Objective-C(來自Java/Android)中的協議。但是,這有效... – mrd

相關問題