如何从UIView类的xib文件导航到ViewController

时间:2016-02-08 10:11:44

标签: ios swift uiview xib

我的xib文件中有一个包含按钮的视图。我想按下按钮(@IBAction)时移动到ViewController。我使用了下面的代码

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("About") as! AboutViewController
self.presentViewController(nextViewController, animated: true, completion: nil)

我收到错误“类型'的值'SlideMenuView'没有成员'presentViewController'。

因为我的类是UIView类型:

class SlideMenuView: UIView { 
}

所以如何导航到其他视图控制器。

2 个答案:

答案 0 :(得分:3)

这是因为您尝试提供的课程是UIView,而不是UIViewController。它没有现在的方法。

我猜你的视图(SlideMenuView)是嵌入在viewcontroller中的。你需要做的是实现一个委托,并通知你包含viewController以呈现下一个Viewcontroller。

以下代码:

@protocol SlideMenuViewDelegate: class {
  func slideMenuViewAboutButtonClicked(menuView: SlideMenuView)
class SlideMenuView: UIView { 

weak var delegate: SlideMenuViewDelegate?

@IBAction func aboutButtonClicked(sender: AnyObject) {
self.delegate?.slideMenuViewAboutButtonClicked(self)
}

现在,在你的viewController中,实现这个委托方法:

func slideMenuViewAboutButtonClicked(menuView: SlideMenuView) {
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("About") as! AboutViewController
self.presentViewController(nextViewController, animated: true, completion: nil)
}

另外,不要忘记将sliderMenuView对象的viewcontroller指定为委托。 类似的东西:

self.sliderMenuView.delegate = self // (self == the containing viewController

答案 1 :(得分:1)

我以不同的方式做到了。在课程文件

类SlideMenuView:UIView {

var navigationController:UINavigationController? //声明导航控制器变量

//创建一个带导航控制器的方法

func prepareScreen(navController:UINavigationController) - > UIView {

    navigationController = navController      
    let nibView = NSBundle.mainBundle().loadNibNamed("SlideMenuView", owner: self, options: nil)[0] as! UIView        
    self.addSubview(nibView)       
    return nibView
}

//在Button动作中

@IBAction func btnAction(sender:UIButton){

     var storyBoard = UIStoryboard(name: "Main", bundle: nil)
    let nextViewController = storyBoard!.instantiateViewControllerWithIdentifier("NextViewController") as! UIViewController
    navigationController?.pushViewController(nextViewController, animated: true)
}

}

//从UIViewController调用

slideBarMenuIstance.prepareScreen(self.navigationController!)