你如何从子视图提出ViewController?

时间:2016-04-21 08:02:20

标签: ios swift uiviewcontroller uialertcontroller presentviewcontroller

假设我们有一个自定义控件,在某些状态下应弹出选项列表供用户选择(UIAlertController)。通常当我们在视图控制器中时,我们使用presentViewController方法,但在这种情况下,我们无法访问保存此方法的父UIViewController。虽然似乎有一些方法可以从子视图中获取UIViewController,但它被认为是针对MVC设计模式的。那你怎么这样做? 我想保持视图控制器尽可能精简,自定义视图(uicontrol)自给自足,所以我不想将此逻辑移动到视图控制器。 虽然欢迎并欢迎您的所有意见和建议。

3 个答案:

答案 0 :(得分:5)

你总是可以使用应用程序rootviewController来呈现你的警报视图控制器:)你不必总是选择视图控制器的视图:)无论你的控制在哪里,都可以访问rootview控制器:)

以下是你可以做的事情:)

目标C

 AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[delegate.window.rootViewController presentViewController:your_alert_view_controller animated:YES completion:nil];

<强>夫特

let appDelegate : AppDelegate? = UIApplication.sharedApplication().delegate as? AppDelegate
if let unwrappedAppdelegate = appDelegate {
     unwrappedAppdelegate.window!.rootViewController! .presentViewController(alert, animated: true, completion: nil)
}

希望我的回答能帮到你:)。

答案 1 :(得分:2)

我更喜欢委托或目标行动。它更清晰,因为在这种情况下你不使用AppDelegate。显示某些内容也不是子视图的责任。授权示例:

protocol MyViewDelegate: class {
    func somethingHappenedToMyView(view: MyView)
}

class MyView: UIView {
    weak var delegate: MyViewDelegate?

    func somethingHappened() {
        delegate?.somethingHappenedToMyView(self)
    }
}

class ViewController: UIViewController, MyViewDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        myView.delegate = self
    }

    func somethingHappenedToMyView(view: MyView) {
        presentViewController(someViewController, animated: true, completion: nil)
    }
}

目标行动示例:

class MyView: UIControl {
    func somethingHappened() {
        sendActionsForControlEvents(.ValueChanged) // .ValueChanged is an example. Maybe other events will be more meaningful for your situation
    }
}

class ViewController: UIViewController, MyViewDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        myView.addTarget(self, action: #selector(self.somethingHappenedToMyView(_:)), forControlEvents: .ValueChanged)
    }

    func somethingHappenedToMyView(view: MyView) {
        presentViewController(someViewController, animated: true, completion: nil)
    }
}

答案 2 :(得分:1)

从委托根视图控制器呈现在许多情况下都不起作用(嵌套演示文稿,选项卡以及更多控制器等)。

通过循环浏览视图的响应者链,更好地找到父UIViewController响应者。使用此宏:

#define UIViewParentController(__view) ({ \
UIResponder *__responder = __view; \
while ([__responder isKindOfClass:[UIView class]]) \
__responder = [__responder nextResponder]; \
(UIViewController *)__responder; \
})

在视图中:

UIViewController *parentViewController = UIViewParentController(self);

相关问题:onetwo