我的设置:
`UITableViewController` (ComboViewController)
-> Several Static Cells
-> One Static Cell contains a dynamic `tableView`
我需要使用自定义Delegate / DataSource,因为动态tableView嵌入在TableViewController
此自定义Delegate / DataSource如下所示:
class DataSource: NSObject, UITableViewDataSource, UITableViewDelegate {
// class variables
override init() {
super.init()
// initialize variables
}
//some data source/ delegate methods like number of rows, cellForRowAtIndexPath
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
var indexedCombos: NSDictionary?
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let comboVC: ComboInfoViewController = storyboard.instantiateViewControllerWithIdentifier("ComboInfo") as! ComboInfoViewController
comboVC.doSegue()
}
}
在ComboViewController
内我有这个:
class ComboInfoViewController: UITableViewController {
func doSegue() {
self.performSegueWithIdentifier("tosingle", sender: combListTable)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "tosingle" {
//do stuff
}
}
}
如果segue是模态的,我会收到此错误:
Warning: Attempt to present SingleProductViewController on ComboInfoViewController whose view is not in the window hierarchy!
如果推送了segue,则会调用prepareForSegue
方法,但viewController
不推送!发生了什么事?
我已经搜索过并搜索过了。但我不知道是什么导致了这种行为。
答案 0 :(得分:0)
使用此行创建ComboInfoViewController实例时,
let comboVC: ComboInfoViewController = storyboard.instantiateViewControllerWithIdentifier("ComboInfo") as! ComboInfoViewController
你正在创建一个新的实例,它不是你在屏幕上拥有的实例,而且永远不会,所以这就是你得到错误的原因。了解这个概念非常重要;了解如何创建视图控制器,以及如何获取已存在的指针是iOS编程的基础。
但是,在这种情况下,您甚至不需要获取指向屏幕上的指针,因为您应该直接从单元格(动态原型)连接segue,这意味着您不需要任何代码执行它。您可以删除didSelectRowAtIndexPath方法和doSegue方法。您只需要实现prepareForSegue。如果您需要根据触摸的行将信息传递给下一个控制器,您可以像下面那样进行操作。表视图控制器代码现在应该如下所示(这是我对这个问题的回答中代码的更新,Swift: TableView within Static UITableViewCell),
class ComboInfoViewController: UITableViewController {
@IBOutlet weak var staticTableView: UITableView!
@IBOutlet weak var dynamicTableView: UITableView!
var dataSource = DataSource()
override func viewDidLoad() {
super.viewDidLoad()
dynamicTableView.dataSource = dataSource
dynamicTableView.delegate = dataSource
}
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if indexPath.row != 1 {
return 44
}else{
return 250 // the second cell has the dynamic table view in it
}
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "tosingle" {
var cell = sender as! UITableViewCell
var indexPath = dynamicTableView.indexPathForCell(cell)
var dataPoint = dataSource.theData[indexPath!.row] // theData is the array used to populate the dynamic table view in the DataSource class
// pass dataPoint to the next view controller which you get from segue.destinationviewController
println(dataPoint)
}
}
}