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

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

我怎样才能做到这一点?

【问题讨论】:

    标签: ios core-data uipickerview


    【解决方案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)。但是,这行得通...
    猜你喜欢
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    相关资源
    最近更新 更多