我有一个MainViewController.swift,它连接到一个Xib文件(称为MainViewController)。 MainViewController连接到MenuViewController.swift及其Xib(称为MenuViewController)。 MainViewController使用以下代码
调用MenuViewContolleroverride func viewDidLoad() {
super.viewDidLoad()
...
menuBtn.addTarget(self, action: #selector(callMenuModal), forControlEvents: .TouchUpInside)
....
}
func callMenuModal() {
let menuVC = MenuViewController()
menuVC.delegate = self
menuVC.modalPresentationStyle = .OverCurrentContext
presentViewController(menuVC, animated: false, completion: nil)
}
.......
func backFromMenu() {
self.dismissViewControllerAnimated(true, completion: nil)
}
...
...
我的朋友们制作了一个包含很多Segues和ViewControllers的故事板。
当从故事板上的ViewController按下按钮时,我现在必须加载我的.xib文件及其相应的视图控制器。我看起来很高和很低的解决方案,但找不到。
之前我直接从AppDelegate调用了我的xib,所以我没有做任何事情。我在故事板上只有一个视图控制器和整个应用程序的应用程序代表,我在代理中使用的代码如下所示,
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
window = UIWindow(frame: UIScreen.mainScreen().bounds)
let mainViewController = MainViewController(nibName: "MainViewController", bundle: nil)
window?.rootViewController = mainViewController
window?.makeKeyAndVisible()
return true
}
........rest of app delegate....
但我不知道如何从故事板中的不同视图控制器或ViewController中的按钮按下(IBAction)加载该xib文件。
答案 0 :(得分:3)
您无法从故事板直接转到MainViewController
。但您可以加载并显示它,就像您的应用代表一样。
您想如何显示MainViewController
?将它推入导航堆栈,以模态方式呈现,还有其他什么?我假设您正在使用UINavigationController
,并且您希望将其推入堆栈。
在您朋友的UIViewController
课程中,添加一种方法来加载并展示您的MainViewController
:
func presentMainViewController() {
let mainVC = MainViewController(nibName:"MainViewController", bundle:nil)
self.navigationController.pushViewController(mainVC, true);
// you could present it another way, such as:
// self.presentViewController(mainVC, true, nil)
// to present it as a modal
}
答案 1 :(得分:1)
解决了......它就在我的眼前,猜我不得不问问题自己写答案,哈哈,我很聪明,我把这个代码添加到视图控制器中故事板,它就像一个魅力。
import UIKit
class ViewController: UIViewController, communicationControllerM {
@IBOutlet weak var Btn: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
Btn.addTarget(self, action: #selector(callMenuModal), forControlEvents: .TouchUpInside)
}
func callMenuModal() {
let mainVC = MainViewController()
mainVC.delegate = self
mainVC.modalPresentationStyle = .OverCurrentContext
presentViewController(mainVC, animated: false, completion: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func backFromM() {
self.dismissViewControllerAnimated(true, completion: nil)
}
}
在我的xib视图控制器中,我添加了一个返回操作
playBtn.addTarget(self, action: #selector(goBackToMainVC), forControlEvents: .TouchUpInside)
self.delegate?.backFromM()
谢谢你们!
答案 2 :(得分:0)
您加载视图控制器及其关联的nib文件的方式与您在代码中已完成的方式完全相同:
let mainViewController = MainViewController(nibName: "MainViewController", bundle: nil)
实例化视图控制器,当您呈现或推送视图控制器时,视图将从笔尖加载并放入界面。
答案 3 :(得分:0)
作为类变量赋值:
var nibName: NibViewClass?
将其分配给为笔尖创建的相应类。
在视图控制器内部,无论您要加载笔尖,请调用
nibName = NSBundle.mainBundle().loadNibNamed("NibView", owner: self, options: nil) as? NibViewClass
确保" NibView" == Nib UI文件的名称。然后你需要将其添加为子视图,如下所示:
if nibName != nil {
self.view.addsubview(nibName!)
//add this line to make it appear where you want it.
nibName.frame = CGRectMake(xPosition, yPositionOffScreen, nibWidth, nibHeight)
}
现在这将为您完成大部分工作,但我也建议您动画一下。有几种不同的方法可以这样做,但我经常使用的方法是这样的:
UIView.animateWithDuration(0.7, delay: 1.0, options: .CurveEaseIn, animations: {
nibName.frame.origin.y = yPositionOnScreen
}, completion: { finished in
//code to run after nib finishes movement
})
在将nibName分配给它的相应类之后的任何时候,您都可以从viewController中分配其局部变量。如果愿意,您也可以选择使用x位置为nib设置动画。我会使用相同的函数,y值反转,在完成后将其发送回屏幕。