Swift - 如何从故事板中的视图控制器加载xib文件?

时间:2016-07-23 01:15:09

标签: swift uikit uistoryboard xib

我有一个MainViewController.swift,它连接到一个Xib文件(称为MainViewController)。 MainViewController连接到MenuViewController.swift及其Xib(称为MenuViewController)。 MainViewController使用以下代码

调用MenuViewContoller
override 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文件。

4 个答案:

答案 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值反转,在完成后将其发送回屏幕。