以编程方式导航到另一个视图控制器/场景
Posted
技术标签:
【中文标题】以编程方式导航到另一个视图控制器/场景【英文标题】:Programmatically navigate to another view controller/scene 【发布时间】:2015-02-07 02:21:19 【问题描述】:在从第一个视图控制器导航到第二个视图控制器期间,我收到一条错误消息。我的编码是这样的
let vc = LoginViewController(nibName: "LoginViewController", bundle: nil)
self.navigationController?.pushViewController(vc, animated: true)
问题是我总是收到这种错误信息
2014-12-09 16:51:08.219 XXXXX[1351:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </var/mobile/Applications/FDC7AA0A-4F61-47E7-955B-EE559ECC06A2/XXXXX.app> (loaded)' with name 'LoginViewController''
*** First throw call stack:
(0x2efcaf0b 0x39761ce7 0x2efcae4d 0x31b693f9 0x31ac1eaf 0x3191e365 0x317fe895 0x318a930d 0x318a9223 0x318a8801 0x318a8529 0x318a8299 0x318a8231 0x317fa305 0x3147631b 0x31471b3f 0x314719d1 0x314713e5 0x314711f7 0x3146af1d 0x2ef96039 0x2ef939c7 0x2ef93d13 0x2eefe769 0x2eefe54b 0x33e6b6d3 0x3185d891 0x4ccc8 0x4cd04 0x39c5fab7)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
【问题讨论】:
您需要在您的项目中添加一个LoginViewController.xib
文件。创建 LoginViewController.swift
时,请确保选择了包含 xib。
尝试添加一个全新的视图控制器并替换LoginViewController
,看看它是否有效。
顺便说一句,我正在使用故事板
我也是,我正在使用情节提要并使用您的代码加载 xib 文件,它对我有用。
要访问代码中的情节提要,您需要在情节提要中设置其情节提要 ID。
【参考方案1】:
我已经找到答案了
斯威夫特 4
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "nextView") as! NextViewController
self.present(nextViewController, animated:true, completion:nil)
斯威夫特 3
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("nextView") as NextViewController
self.presentViewController(nextViewController, animated:true, completion:nil)
【讨论】:
从 ViewController 中,您可以使用 self.StoryBoard 访问故事板 它隐藏了“导航栏” @Danny182 如果要显示导航栏,请使用self.navigationController?.pushViewController(nextViewController, animated: true)
如果它有 UINavigationController 标签到 UITabbarViewController 如何推送 UINavigationController?
It(Swift 4) 以模态方式呈现新的视图控制器【参考方案2】:
试试这个。这里“LoginViewController”是storyboard中指定的storyboardID。
见下文
let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as LoginViewController
self.navigationController?.pushViewController(secondViewController, animated: true)
【讨论】:
我很惊讶 Nurdin 的回答被建议有效(但它没有),因为它只是在调用 push。这当然看起来应该可以工作,因为我们正在处理导航控制器【参考方案3】:XCODE 8.2 和 SWIFT 3.0
存在UIViewController
let loginVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
self.present(loginVC, animated: true, completion: nil)
推送存在UIViewController
let loginVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
self.navigationController?.pushViewController(loginVC, animated: true)
请记住,您可以将UIViewController
标识符放在后续步骤之后:
Main.storyboard
选择您的UIViewController
在右侧搜索实用程序
选择身份检查员
在部分标识“Storyboard ID”中搜索
为您的UIViewController
输入标识符
【讨论】:
正确答案,我投了赞成票,但为什么我们需要“恢复 ID”?我相信“Storyard ID”足以应付这种情况。 感谢您的反馈@yucelbayram 恢复标识符是一个字符串,您需要将其分配给要保留和恢复的任何视图控制器或视图。就我而言,我使用此字段是因为我需要确定的功能,但是如果您不需要它可以删除。【参考方案4】:如果您想导航到以编程方式创建的控制器,请执行以下操作:
let newViewController = NewViewController()
self.navigationController?.pushViewController(newViewController, animated: true)
如果您想使用标识符“newViewController”导航到 StoryBoard 上的控制器,请执行以下操作:
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "newViewController") as! NewViewController
self.present(newViewController, animated: true, completion: nil)
【讨论】:
【参考方案5】:Swift3:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController("LoginViewController") as UIViewController
self.navigationController?.pushViewController(vc, animated: true)
试试这个。您只是将 nib 与故事板表示混淆了。
【讨论】:
【参考方案6】:看我的。
func actioncall ()
let loginPageView = self.storyboard?.instantiateViewControllerWithIdentifier("LoginPageID") as! ViewController
self.navigationController?.pushViewController(loginPageView, animated: true)
如果您使用呈现样式,您可能会丢失带有预设推送导航的页面导航栏。
【讨论】:
【参考方案7】:您可以使用以下代码以编程方式从一个场景移动到另一个场景:
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let objSomeViewController = storyBoard.instantiateViewControllerWithIdentifier(“storyboardID”) as! SomeViewController
// If you want to push to new ViewController then use this
self.navigationController?.pushViewController(objSomeViewController, animated: true)
// ---- OR ----
// If you want to present the new ViewController then use this
self.presentViewController(objSomeViewController, animated:true, completion:nil)
这里的storyBoardID 是您使用Interface Builder 为场景设置的值。 如下所示:
【讨论】:
【参考方案8】:根据不同的情况有不同的编程方式
load storyenter code hereboard nib文件
let yourVc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "YourViewController") as! YourViewController;
self.present(yourVc, animated: true, completion: nil)
从xib加载
let yourVc = YourViewController.init(nibName: "YourViewController", bundle: nil)
self.present(yourVc, animated: true, completion: nil)
在 Segue 中导航
self.performSegue(withIdentifier: "your UIView", sender: self)
【讨论】:
谢谢。我尝试将该方法用于 xib,而我需要用于情节提要的方法。你的回答对我帮助很大!【参考方案9】:let VC1 = self.storyboard!.instantiateViewController(withIdentifier: "MyCustomViewController") as! ViewController
let navController = UINavigationController(rootViewController: VC1)
self.present(navController, animated:true, completion: nil)
【讨论】:
【参考方案10】:您可以在视图控制器的 storyboard 和 storyboardId 的帮助下使用代码在视图控制器之间进行导航。 此代码适用于 Swift 3:
let signUpVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SignUp")
self.navigationController?.pushViewController(signUpVC, animated: true)
【讨论】:
对于您的答案中的代码,您能想到什么介绍或解释吗?也许第一句话就像“我认为你想要这样的代码:”。【参考方案11】:除了上面关于在应用程序的屏幕顶部设置导航视图控制器的好答案外,您还可以将其添加到块内的 AppDelegate.swift 文件中,如下所示
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
window = UIWindow()
window?.makeKeyAndVisible()
window?.rootViewController = UINavigationController(rootViewController: LoginViewController())
return true
【讨论】:
【参考方案12】:XCODE 9.2 和 SWIFT 3.0
ViewController
到 NextViewcontroller
没有 Segue 连接
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController
self.navigationController?.pushViewController(nextViewController, animated:true)
或
let VC:NextViewController = storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController
self.navigationController?.pushViewController(VC, animated: true)
【讨论】:
【参考方案13】:我不确定尝试以下步骤,我认为可能是以下原因发生错误。
您在 XCode 之外重命名了一些文件。要解决它,请从您的项目中删除文件并重新导入项目中的文件。 在构建阶段->复制捆绑资源中检查并添加缺失的 Nib 文件。最后检查 nib 名称的拼写,是否正确,区分大小写。 在文件检查器中检查.xib/storyboard文件的属性,属性“Target Membership”选中选择框,然后你的xib/storyboard文件已与您的目标相关联。 例如NIB类型不正确。右键单击文件并单击“获取信息”以验证类型是否符合您的预期。【讨论】:
【参考方案14】:我给你我的代码来进行转换。
在此示例中,操作连接到 UIButton。所以不要忘记设置它。
不要忘记在 transition
方法中设置 ViewController 的名称。
别忘了也设置故事板。您需要每个 viewController 有一个视图。将每个 ViewController 连接到 storyBoard 中的每个视图。您可以在下面的屏幕截图中看到
class PresentationViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
var playButton = UIButton.buttonWithType(UIButtonType.System) as UIButton
let image = UIImage(named: "YourPlayButton") as UIImage?
playButton.frame = CGRectMake(0, 0, 100, 100)
playButton.center = CGPointMake(self.view.frame.width/2, self.view.frame.height/2)
playButton.addTarget(self, action: "transition:", forControlEvents: UIControlEvents.TouchUpInside)
playButton.setBackgroundImage(image, forState: UIControlState.Normal)
self.view.addSubview(playButton)
func transition(sender:UIButton!)
println("transition")
let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("YourSecondViewController") as UIViewController
let window = UIApplication.sharedApplication().windows[0] as UIWindow
UIView.transitionFromView(
window.rootViewController!.view,
toView: secondViewController.view,
duration: 0.65,
options: .TransitionCrossDissolve,
completion:
finished in window.rootViewController = secondViewController
)
【讨论】:
【参考方案15】:如果您在构建 UI 时无需拖放(不使用情节提要) 并想将默认页面或 ViewController.swift 导航到另一个页面? 按着这些次序 1)添加一个类(.swift) 2) 导入 UIKit 3) 像这样声明类名
class DemoNavigationClass :UIViewController
override func viewDidLoad()
let lbl_Hello = UILabel(frame: CGRect(x:self.view.frame.width/3, y:self.view.frame.height/2, 200, 30));
lbl_Hello.text = "You are on Next Page"
lbl_Hello.textColor = UIColor.white
self.view.addSubview(lbl_Hello)
创建第二页后返回第一页 (ViewController.swift) 这里在 viewDidLoad 方法中做一个按钮
let button = UIButton()
button.frame = (frame: CGRect(x: self.view.frame.width/3, y: self.view.frame.height/1.5, width: 200, height: 50))
button.backgroundColor = UIColor.red
button.setTitle("Go to Next ", for: .normal)
button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
self.view.addSubview(button)
现在在同一类的 viewDidLoad() 之外定义 buttonAction 方法
func buttonAction(sender: UIButton!)
let obj : DemoNavigationClass = DemoNavigationClass();
self.navigationController?.pushViewController(obj, animated: true)
保留一件我忘记的事情 在 main.storyboard 中有一个带箭头的场景, 选择该箭头并按删除按钮
现在拖放一个导航控制器并删除导航控制器附带的表格视图。 选择navigationcontroller 按下键盘上的控件并将其拖入情节提要上的另一个场景,即ViewController。 这意味着您的视图控制器成为根视图控制器 希望这对你有帮助 谢谢 在 main.storyboard 中,拖放导航控制器,
【讨论】:
【参考方案16】:let signUpVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SignUp")
// self.present(signUpVC, animated: false, completion: nil)
self.navigationController?.pushViewController(signUpVC, animated: true)
【讨论】:
你需要在你的答案周围添加一些内容并稍微解释一下。【参考方案17】:Swift 4.0.3
@IBAction func registerNewUserButtonTapped(_ sender: Any)
print("---------------------------registerNewUserButtonTapped --------------------------- ");
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "RegisterNewUserViewController") as! RegisterNewUserViewController
self.present(nextViewController, animated:true, completion:nil)
更改我们的控制器名称 RegisterNewUserViewController
【讨论】:
应该是storyboard
【参考方案18】:
我想你正在寻找这样的东西:
let signUpViewController = SignUpViewController()
present(signUpViewController, animated: true, completion: nil)
如果你想全屏显示新页面:
present(signUpViewController, animated: true, completion: nil)
希望这会有所帮助:)
【讨论】:
【参考方案19】: let vc = DetailUserViewController()
vc.userdetails = userViewModels[indexPath.row]
self.navigationController?.pushViewController(vc, animated: true)
【讨论】:
以上是关于以编程方式导航到另一个视图控制器/场景的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式导航到另一个故事板上的导航控制器和标签栏控制器内的视图控制器
Swift:通过 TabBar 和导航控制器以编程方式从一个视图转换到另一个视图
如何在 ios 9 中以编程方式导航到另一个具有“当前上下文”表示的视图控制器,目标 C