【问题标题】:Setting a delegate between a view controller and a non presented view controller在视图控制器和未呈现的视图控制器之间设置委托
【发布时间】:2016-06-10 23:16:09
【问题描述】:

我有一个视图控制器,ViewControllerA。

我设置了一个模式 ViewControllerB,它转换到另一个视图控制器 ViewControllerC,然后被解除以显示 ViewControllerA。

当我不从 ViewControllerA 推送 ViewControllerC 时,如何在 ViewControllerA 和 ViewControllerC 之间设置委托方法,因此我无法在 ViewControllerA 文件中显式设置它的委托?

谢谢。

【问题讨论】:

    标签: ios delegates modal-dialog viewcontroller dismiss


    【解决方案1】:

    当某事完成时,您可以使用闭包来传递回调。听起来 ViewControllerA 不应该对 ViewControllerC 有任何了解。 ViewControllerA 只是打开 ViewControllerB 然后需要接收反馈。下面是它的外观:

    class ViewControllerA: UIViewController {
        let viewControllerB = ViewControllerB()
        func showViewControllerB() {
            viewControllerB.onFinish = {
                // work is done in ViewControllerB and C
            }
            presentViewController(viewControllerB, animated: true, completion: nil)
        }
    }
    

    ViewControllerB 和 ViewControllerC 如下所示:

    class ViewControllerB: UIViewController {
        var onFinish: (() -> ())?
        let viewControllerC = ViewControllerC()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            viewControllerC.onFinish = { [weak self] in
                self?.onFinish?()
            }
        }
    
        func showViewControllerC() {
            presentViewController(viewControllerC, animated: true, completion: nil)
        }
    }
    
    class ViewControllerC: UIViewController {
        var onFinish:(() -> ())?
        func didFinishDoSomething() {
            onFinish?()
        }
    }
    

    上面的代码只是展示了如何在视图控制器之间为回调重用闭包的概念。


    如果你使用 Objective-C,这个概念是一样的。在这种情况下使用块:

    @interface ViewControllerA: UIViewController
    @property (strong) ViewControllerB *viewControllerB;
    @end
    
    @implementation ViewControllerA
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.viewControllerB.onFinish = ^{
            // work is done in both VC B and VC C
        };
    }
    
    - (void)showViewControllerB {
        [self presentViewController:self.viewControllerB animated:YES completion:nil];
    }
    
    @end
    

    其中onFinish 是 ViewControllerB @property (copy) void (^onFinish)(); 的一个属性

    【讨论】:

    • 非常感谢,我试试看!是的,这对我来说是 Objective C!
    猜你喜欢
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多