关闭模态视图控制器时更新前一个视图控制器中的pickerView

Posted

技术标签:

【中文标题】关闭模态视图控制器时更新前一个视图控制器中的pickerView【英文标题】:update pickerView in previous view controller when closing modal view controller 【发布时间】:2014-02-11 14:46:28 【问题描述】:

我在视图控制器 A 中有一个选择器视图(作为文本字段的 inputView)。 为了使用户能够选择一个新值(还不是pickerview的一行),有一个按钮以模态方式呈现另一个视图控制器B,用户可以在其中创建一个新值。关闭后,我希望使用新值更新文本字段及其 inputView pickerView。 我的 pickerview 由 CoreData 的 NSArray 支持。不幸的是,当我关闭视图控制器 B 时,pickerview 没有更新,尽管核心数据中的新值已更新。

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

一个好的解决方案是实现委托模式(Cocoa 中的一种常见模式):

在 ViewControllerB.h 中声明一个 ViewControllerBDelegate 协议。 然后在您的 ViewControllerB 接口中添加一个委托作为 ivar。

//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

【讨论】:

Tx @Francescu,我猜你的方法是“按书本”的正确方法。我使用了简化版本,因为我已经将 ViewControllerA 作为 ViewControllerB 的委托。我更新了 NSArray,它将我的核心数据对象存储在 viewWillAppear 中,重新加载选择器视图,但没有将其声明为协议,因为我不熟悉 Objective-C(来自 Java/android)。但是,这行得通...

以上是关于关闭模态视图控制器时更新前一个视图控制器中的pickerView的主要内容,如果未能解决你的问题,请参考以下文章

旋转设备时表格视图更新无效

在后台关闭模态视图控制器

从 uitabbarController 视图中关闭模态视图

当被模态视图控制器覆盖时,iOS 6 视图控制器布局在方向更改后不会更新

视图控制器以模态方式呈现/关闭时的通知?

为啥一个简单的模态视图控制器在呈现和关闭时会滞后?