如何在iOS Swift 3中以编程方式从XIB推送并呈现给UIViewController

如何在iOS Swift 3中以编程方式从XIB推送并呈现给UIViewController,ios,swift,swift3,uinavigationcontroller,Ios,Swift,Swift3,Uinavigationcontroller,我正在从事swift 3.0中的一个项目,我使用以下机制从一个UIViewController导航到另一个UIViewController if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MP3ViewController") as? MP3ViewController { viewController.mediaDetails

我正在从事swift 3.0中的一个项目,我使用以下机制从一个UIViewController导航到另一个UIViewController

if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MP3ViewController") as? MP3ViewController {
  viewController.mediaDetails = mp3Details
  if let navigator = navigationController {
      navigator.pushViewController(viewController, animated: true)
  }
}
但是,当我在XIB文件中尝试相同的机制时,它会给我一个错误

if let categoriesController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "CategoriesViewController") as? CategoriesViewController {
  categoriesController.categoryName = trimmedCategortyNameText

  if let navigator = navigationController {
      navigator.pushViewController(categoriesController, animated: true)
  }
}
错误:说“使用未解析的标识符navigationController”

我如何在这里创建navigationController实例?下面我展示了我的XIB类的代码,它给了我一个错误

if let categoriesController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "CategoriesViewController") as? CategoriesViewController {
  categoriesController.categoryName = trimmedCategortyNameText

  if let navigator = navigationController {
      navigator.pushViewController(categoriesController, animated: true)
  }
}
您可以这样做:

   let  vc =  MP3ViewController(nibName:"MP3ViewController",bundle:Bundle.main)
   vc.mediaDetails = mp3Details
    if let navigator = self.navigationController {
        navigator.pushViewController(viewController, animated: true)
    }else{
        let navigation  = UINavigationController(rootViewController:viewController)
        self.present(navigation, animated: true, completion: nil)
    }
如果您正在使用故事板:

if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MP3ViewController") as? MP3ViewController {
        viewController.mediaDetails = mp3Details
        if let navigator = self.navigationController {
            navigator.pushViewController(viewController, animated: true)
        }else{
            let navigation  = UINavigationController(rootViewController:viewController)
            self.present(navigation, animated: true, completion: nil)
        }
}
使用Xib

按如下方式初始化UIViewController的实例:

   let  vc =  MP3ViewController(nibName:"MP3ViewController",bundle:Bundle.main)
   vc.mediaDetails = mp3Details
    if let navigator = self.navigationController {
        navigator.pushViewController(viewController, animated: true)
    }else{
        let navigation  = UINavigationController(rootViewController:viewController)
        self.present(navigation, animated: true, completion: nil)
    }

希望这对你有帮助

    let sampleVC = SampleViewController(nibName: "SampleViewController", bundle: nil)
    self.navigationController?.pushViewController(sampleVC, animated: true)
编辑 根据您的要求,您需要从UIView导航到UIViewController。 您可以通过两种方式实现这一点

  • 使用委托/回调
  • 使用导航控制器的参考
我会告诉你第二条路

在AppDelegate中获取变量
UINavigationController

在AppDelegate中

var navController : UINavigationController?
然后将导航控制器分配给该变量,从该变量导航到UIView。(假设从SampleViewController添加UIView,然后写入)

在视图控制器中(这是我的主VC)

然后在
UIView
类中(SampleView在我的例子中)

我证实了这一点。
快乐编码..

您可以使用Appdelegate对Xib使用相同的机制

let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let currentOrderVC = storyboard.instantiateViewController(withIdentifier: "yourVcId") as! YourVC

        var nav1 = UINavigationController()
        nav1.viewControllers = [currentOrderVC]

        UIApplication.shared.keyWindow?.rootViewController
        UIApplication.shared.keyWindow?.rootViewController = nav1
        UIApplication.shared.keyWindow?.makeKeyAndVisible();

请显示创建navigationController的代码。我想您需要调用self.navigationController.pushViewController。并确保您当前的视图控制器嵌入到NavigationController中。您不能将其bcz声明为“self.navigationController”。我该如何解决this@danu看到我的答案了吗?你可以把代码放在你的xib类文件中。你在xib文件中看到这个
机制了吗。上面写着“类型的值…视图没有成员导航控制器我已经编辑了答案以使用xib@Anbu.karthik问题是xib的类类型是UIView。您不能将其bcz声明为“self.navigationController”。我该怎么解决这个问题呢?请你把它改成我的问题好吗answer@danu我认为您需要将UIStoryboard(名称:“Main”,bundle:nil)替换为?MP3ViewController和MP3ViewController(nibName:“SampleViewController”,bundle:nil)让我知道这是否适用于您。问题是XIB的类类型是UIView。您不能将其bcz声明为“self.navigationController”。我该如何解决这个问题呢?我不认为您可以从ViewController对UIView类执行推送或弹出操作。如果要从UIView推送到viewController,可以在中引用navigationControllerAppDelegate@danu如果要从任何ViewController导航到UIView,则可以在ViewController视图上添加视图,并添加动画以产生推送动画的效果。如果有帮助,请告诉我。