如何以编程方式在视图控制器上生成弹出窗口?

时间:2017-08-18 09:23:56

标签: ios swift

我的目标是以编程方式显示View Controller

当前视图控制器

enter image description here

然后,如果某个事件被调用或某事,(API或Websocket)我想以编程方式调用这些视图

enter image description here

但我想先调用最后一个视图Controller,它应该位于第一个View控制器之上

enter image description here

从技术上讲,最后一个视图将具有

Transition is Cross Dissolve
Presentation is Over Current Context

我该怎么做?

4 个答案:

答案 0 :(得分:5)

我认为可重用视图的最佳方法是创建一个xib文件。然后,您可以创建单例并在每次要显示此模态视图时调用此视图。

要确保视图不与任何内容重叠,您必须将其添加到当前控制器,而不是添加到AppDelegate窗口。

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.window!.addSubview(yourModalView)

答案 1 :(得分:4)

根据您的要求,您可以为导航控制器设置storyBoardID。

在特定事件上,只需实例化导航控制器 let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main) let myNavController = storyboard.instantiateViewController(withIdentifier: "MyStoryboardId") as? UINavigationController

然后出现或显示此导航控制器

self.present(myNavController, animated: true, completion: nil)

在第一个视图控制器的viewDidLoad()方法上执行segue到popupViewController。

现在第二个视图将显示在第一个视图控制器上方。您可以在使用它后忽略此视图。

答案 2 :(得分:4)

您无需为弹出窗口创建整个UIViewController

您可以展示通常的UIView。例如:

以编程方式创建视图:

let popupView: UIView = {
    let view = UIView()
    view.backgroundColor = .red
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
}

在您需要时插入视图:

private func showPopup() {
    view.addSubview(popupView)
    popupView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    popupView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    popupView.widthAnchor.constraint(equalToConstant: 100.0).isActive = true
    popupView.heightAnchor.constraint(equalToConstant: 100.0).isActive = true
}

您还可以在 popupView

中添加观看次数
    let myLabel: UILabel = {
        let label = UILabel()
        label.text = "Test text"
        label.backgroundColor = .red
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }

    private func setupPopup() {
        // add UILabel for example
        popupView.addSubview(myLabel)
        // Setup constraints for myLabel
        ....
    }

答案 3 :(得分:4)

您可以通过覆盖app_name = 'clubinfo' 子类'init方法来完成此操作。

UIViewController

然后在您的其他class SomeViewController: UIViewController { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.modalTransitionStyle = .crossDissolve self.modalPresentationStyle = .overFullScreen } override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) self.modalTransitionStyle = .crossDissolve self.modalPresentationStyle = .overFullScreen } // if this is a xib UIViewController, if not do not add this code required init() { // place the "SomeViewController's Nib Name" in the nibName to prevent crashes from iOS 8 devices super.init(nibName: "SomeViewController's Nib Name", bundle: nil) } } 上,您可以初始化所述ViewController。

xib和/或以编程方式

UIViewController

<强>故事板

// instantiate your UIViewController
let viewController = SomeViewController()
self.present(viewController, animated: true, completion: nil)

确保您的视图层次结构如下所示

enter image description here

这应该是他们的属性

查看

  • backgroundColor = .clear

半透明深色背景视图

  • backgroundColor = .black
  • alpha = 0.4

Popover View

..无论你想要什么