在分离的视图控制器上呈现视图控制器

Yur*_*rov 13 viewcontroller ios swift

我有sideViewController一个按钮和Action,通过单击此按钮显示新的视图控制器.

class sideViewController: UIViewController {
    @IBOutlet var buttonVC1 : UIButton!
    @IBAction func goToVC1 () {
        var VC1 = self.storyboard.instantiateViewControllerWithIdentifier("ViewController") as ViewController
        presentViewController(VC1, animated:true, completion: nil)
    }
}
Run Code Online (Sandbox Code Playgroud)

我在主视图控制器中使用它:

class ViewController: UIViewController {
    var menu : sideViewController!
    override func viewDidLoad() {
        super.viewDidLoad()
        menu = self.storyboard.instantiateViewControllerWithIdentifier("menu") as      sideViewController
        menu.view.frame = CGRect(x: 0, y: 0, width: 160, height: 480)
        view.addSubview(menu.view)
}
Run Code Online (Sandbox Code Playgroud)

当我单击此按钮时,问题是:"不鼓励在分离的视图控制器上显示视图控制器"

我该怎么做才能解决这个问题?

bol*_*nad 9

我自己也遇到了同样的警告,并意识到我正在接受它,因为当我打电话时

self.presentViewController

我在一个视图控制器上调用它,该控制器没有通过视图层次结构连接到UIWindow.您需要更改正在执行的操作以延迟调用,presentViewController直到您知道视图位于视图堆栈上.这将在ViewDidLoad或ViewDidAppear中完成,或者如果您来自后台状态,等待您的应用处于活动状态


Ron*_*ler 3

问题

iOS 抱怨主视图之后出现的其他视图(分离视图)正在呈现某些内容。它可以呈现它,显然它确实做到了,但不鼓励这样做,因为这样做不是一个好的做法。

解决方案

委托/协议模式适合解决这个问题。通过使用此模式,操作将在 内部触发,SideVC尽管此触发器将被发送到MainVC并在那里执行。

因此,既然动作会由 触发MainVC,那么从 iOS 的角度来看,一切都会安然无恙。

代码

侧VC:

protocol SideVCDelegate: class {
  func sideVCGoToVC1()
}

class sideVC: UIViewController {
  weak var delegate: SideVCDelegate?

  @IBOutlet var buttonVC1: UIButton!

  @IBAction func goToVC1 () {
    delegate.sideVCGoToVC1()
  }
Run Code Online (Sandbox Code Playgroud)

主VC

class MainVC: UIViewController, SideVCDelegate {
  var menu: sideVC!

  override func viewDidLoad() {
    super.viewDidLoad()
    menu = self.storyboard?.instantiateViewControllerWithIdentifier("menu") as sideViewController
    menu.delegate = self
    menu.view.frame = CGRect(x: 0, y: 0, width: 160, height: 480)
    view.addSubview(menu.view)
  }

  // MARK: - SideViewControllerDelegate
  func sideViewControllerGoToVC1() {
    menu.view.removeFromSuperview()
    var VC1 = self.storyboard?.instantiateViewControllerWithIdentifier("ViewController") as ViewController
    presentViewController(VC1, animated:true, completion: nil)
  }
}
Run Code Online (Sandbox Code Playgroud)

笔记

除了您提出的问题之外,以下几行似乎有些模糊。

var VC1 = self.storyboard?.instantiateViewControllerWithIdentifier("ViewController") as ViewController
menu.view.frame = CGRect(x: 0, y: 0, width: 160, height: 480)
Run Code Online (Sandbox Code Playgroud)

您将从情节提要中获得一个视图控制器,当您在 Interface Builder 中设计它时,它有一个框架,但之后您要更改它。创建视图框架后就对其进行操作并不是一个好习惯。

也许您打算做其他事情,但最有可能的是,这是一段有问题的代码。