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)
当我单击此按钮时,问题是:"不鼓励在分离的视图控制器上显示视图控制器"
我该怎么做才能解决这个问题?
我自己也遇到了同样的警告,并意识到我正在接受它,因为当我打电话时
self.presentViewController
我在一个视图控制器上调用它,该控制器没有通过视图层次结构连接到UIWindow.您需要更改正在执行的操作以延迟调用,presentViewController直到您知道视图位于视图堆栈上.这将在ViewDidLoad或ViewDidAppear中完成,或者如果您来自后台状态,等待您的应用处于活动状态
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 中设计它时,它有一个框架,但之后您要更改它。创建视图框架后就对其进行操作并不是一个好习惯。
也许您打算做其他事情,但最有可能的是,这是一段有问题的代码。
| 归档时间: |
|
| 查看次数: |
12849 次 |
| 最近记录: |