Swift: Segue(modal) 到嵌入另一个导航控制器的 TableViewController
Swift: Segue(modal) to a UITableViewController which embeded in antoher navigation controller
背景:我想显示从 UITableViewController(A) 到 UITableViewController(B) 的模态转场,但我想要向 "Cancel" 和 "Save".
显示 NavigationBar
我做了什么:
在情节提要中:
- 我用 ctrl 将单元格从 A 拖到 B,并设置了 segue identifer "selectItem"
- 我选B select "Editor - Embed in - Navigation Controller"
在 A 中 ViewController:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifer == "selectItem" {
if let indexPath = self.tableView.indexPathForSelectedRow() {
let destinationViewController = segue.destinationViewController as B
// Pass value from A to B
}
}
}
错误:应用程序在 let destinationViewController = segue.destinationViewController as B
崩溃,错误为 swift_dynamicCastClassUnconditional
。如果我没有在 B 中嵌入导航控制器,程序就不会崩溃。但我真的需要一个导航栏。
有什么解决方案或其他方法可以实现这一目标吗?谢谢!
PS:我尝试从情节提要中的对象库中拖出一个 NavigationBar,但是它缺少了一部分背景来覆盖状态栏...
- 在故事板中创建两个
UITableViewController
。
- Select 您的第二个
UITableViewController
(您想要模态呈现的那个),并将其嵌入 UINavigationController
.
- 将“取消”和“保存”
UIBarButtonItem
添加到第二个[=的UINavitionItem
中11=].
- Select 你的第一个
UITableViewController
UITablViewCell
Control+Drag
进入你的 UINavigationController
.
- Select “
Present Modally
”在下拉列表的 "Selecteion Segue" 选项下。
- 要在您的第一个
UITableViewController
中传递数据,请重写方法:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "identifier" {
let destination = segue.destinationViewController as UINavigationController
let bViewController = destination.topViewController as BViewController
// pass data
}
}
截图如下:
这应该可以完成工作,干杯!
我解决了!
我在let dest = segue.destinationViewController as B
这一行加了一个BreakPoint,发现segue.destinationViewController
是NavigationController
类型的。所以我通过将此行替换为:
来修复它
let dest = segue.destinationViewController as UINavigationController
let bVC = dest.topViewController as B
并做一些传递价值的事情。
希望这会帮助其他面临这个问题的人。
我用
if let b = segue.destinationViewController.childViewControllers.first as? B {
//do something with b
}
对于这种情况。不过,这实际上只是语法差异。
背景:我想显示从 UITableViewController(A) 到 UITableViewController(B) 的模态转场,但我想要向 "Cancel" 和 "Save".
我做了什么:
在情节提要中:
- 我用 ctrl 将单元格从 A 拖到 B,并设置了 segue identifer "selectItem"
- 我选B select "Editor - Embed in - Navigation Controller"
在 A 中 ViewController:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifer == "selectItem" {
if let indexPath = self.tableView.indexPathForSelectedRow() {
let destinationViewController = segue.destinationViewController as B
// Pass value from A to B
}
}
}
错误:应用程序在 let destinationViewController = segue.destinationViewController as B
崩溃,错误为 swift_dynamicCastClassUnconditional
。如果我没有在 B 中嵌入导航控制器,程序就不会崩溃。但我真的需要一个导航栏。
有什么解决方案或其他方法可以实现这一目标吗?谢谢!
PS:我尝试从情节提要中的对象库中拖出一个 NavigationBar,但是它缺少了一部分背景来覆盖状态栏...
- 在故事板中创建两个
UITableViewController
。 - Select 您的第二个
UITableViewController
(您想要模态呈现的那个),并将其嵌入UINavigationController
. - 将“取消”和“保存”
UIBarButtonItem
添加到第二个[=的UINavitionItem
中11=]. - Select 你的第一个
UITableViewController
Control+Drag
进入你的UINavigationController
.- Select “
Present Modally
”在下拉列表的 "Selecteion Segue" 选项下。 - 要在您的第一个
UITableViewController
中传递数据,请重写方法:
UITablViewCell
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "identifier" {
let destination = segue.destinationViewController as UINavigationController
let bViewController = destination.topViewController as BViewController
// pass data
}
}
截图如下:
这应该可以完成工作,干杯!
我解决了!
我在let dest = segue.destinationViewController as B
这一行加了一个BreakPoint,发现segue.destinationViewController
是NavigationController
类型的。所以我通过将此行替换为:
let dest = segue.destinationViewController as UINavigationController
let bVC = dest.topViewController as B
并做一些传递价值的事情。
希望这会帮助其他面临这个问题的人。
我用
if let b = segue.destinationViewController.childViewControllers.first as? B {
//do something with b
}
对于这种情况。不过,这实际上只是语法差异。