从Custom DataSource / Delegate Swift查看DidSelectRowAtIndexPath

时间:2015-04-13 22:34:03

标签: objective-c uitableview swift segue

我的设置:

`UITableViewController` (ComboViewController)
 -> Several Static Cells
  -> One Static Cell contains a dynamic `tableView`

我需要使用自定义Delegate / DataSource,因为动态tableView嵌入在TableViewController

中的静态TableView中

此自定义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不推送!发生了什么事?

我已经搜索过并搜索过了。但我不知道是什么导致了这种行为。

1 个答案:

答案 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)
        }
    }
}