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

Posted

技术标签:

【中文标题】如何从 UIView 类的 xib 文件导航到 ViewController【英文标题】:How to navigate To a ViewController From xib file of a UIView Class 【发布时间】:2016-02-08 10:11:44 【问题描述】:

我的 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  

那么我如何导航到其他视图控制器。

【问题讨论】:

【参考方案1】:

那是因为您尝试演示的课程是 UIView 而不是 UIViewController。它没有 Present 方法。

我猜您的视图 (SlideMenuView) 嵌入在视图控制器中。您需要做的是实现一个委托,并通知您包含的 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)

另外,不要忘记将滑块菜单视图对象分配给视图控制器作为委托。 类似:

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

【讨论】:

感谢您的帮助! @Lirik @S.Bharti,很高兴为您提供帮助。如果您可以点击复选标记,如果您接受了这个答案,我会很高兴。【参考方案2】:

我以不同的方式做到了。在类文件中

class SlideMenuView: UIView  

 var navigationController: UINavigationController? // Declare a navigation controller variable

// And create a method which take a navigation controller 


  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
    

// In Button action 

 @IBAction func btnAction(sender: UIButton) 

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

// For calling from UIViewController

    slideBarMenuIstance.prepareScreen(self.navigationController!)

【讨论】:

以上是关于如何从 UIView 类的 xib 文件导航到 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

如何从 XIB 中删除表视图?

带有 Xib 文件的 UIView 的子类

如何从 ViewController 中的 xib (nib) 实例化 UIView / UITableView

在 xib 视图文件之间导航

自定义 UIView XIB 内的 iOS 导航返回按钮(无导航控制器)

从xib初始化的UIView如何继承?