swift UIKit关闭以更新控制器UI

bnl4lu3b  于 2023-06-21  发布在  Swift
关注(0)|答案(1)|浏览(98)

如何创建一个闭包来允许你修改控制器的用户界面?
类似这样的东西::

// Presents controller
present(MyController()) {
    // Updates Controller
    $0.backgroundColor = .red
    $0.delegate = self
}

而不是:

let controller = MyController()
// Updates Controller

controller.backgroundColor = .red
controller.delegate = self

// Presents controller
present(controller, animated: true)

我希望能够做到这一点,因为代码看起来更有组织,没有那么多的变量和常量。

yqlxgs2m

yqlxgs2m1#

extension UIViewController {
    func present(_ controller: UIViewController, completion: (UIViewController) -> Void) {
        present(controller, animated: true) {
            completion(controller)
        }
    }
}

注意保留周期。您可能希望将controller参数设置为可选参数,以确保它被弱持有。或[unowned controller],位于present(_:animated:)完成块的左括号旁边。
还要注意,在演示动画完成后 * 更新视图控制器的背景颜色对用户来说可能看起来很奇怪。您可能需要采取不同的方法,例如:

extension UIViewController {
    func then(_ block: (Self) -> Void) -> Self {
        block(self)
        return self
    }
}

(This可以推广到不仅仅是UIViewController
用途:

MyController().then {
     $0.view.backgroundColor = .red
     $0.delegate = self
     self.present($0, animated: true)
}

相关问题