如何在iOS Swift 3中以编程方式从XIB推送并呈现给UIViewController
我正在从事swift 3.0中的一个项目,我使用以下机制从一个UIViewController导航到另一个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
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。
您可以通过两种方式实现这一点
- 使用委托/回调
- 使用导航控制器的参考
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视图上添加视图,并添加动画以产生推送动画的效果。如果有帮助,请告诉我。