如何从tableviewcell中删除并将每个单元格中的不同数据传递到下一个tableview?

时间:2016-09-13 13:38:50

标签: ios swift uitableview segue

我正在尝试通过创建一个表示每个列表项的类来练习使用模型创建列表应用程序。我有一个Category类,它包含三个属性 - 两个字符串和一个字符串数组。这是班级:

class Category {

   var name: String
   var emoji: String
   var topics: [String]
   // (the getCategories method listed below goes here) //  

 init(name: String, emoji: String, topics: [String]) {
    self.name = name
    self.emoji = emoji
    self.topics = topics 
 }

在我的Category类中,我有一个方法可以为类别赋值,这样我就可以将它们保留在视图控制器之外。这种方法如下:

class func getCategories() -> [Category]
{
   let categories = 
    [Category(name:"cat", emoji:"", topics:["paws","tails", "fur", "pussyfoot","purr", "kitten", "meow"]), 
    Category(name: "car", emoji: "", topics: ["motor", "speed", "shift", "wheel", "tire"])
    ]
 return categories
}

我有两个UITableViewControllers - CategoryTableViewController和TopicsTableViewController;我希望用户能够点击CategoryTableViewController中的类别单元格,然后转到TopicsTableViewController,其中所选类别的主题显示在tableview中。

到目前为止,我能够将单元格转移到TopicsTableViewController,但无论我选择哪个类别,它都会显示相同的主题。以下是我在CategoriesTableViewController中设置didSelectRowAtIndexPath和prepareForSegue的方法......

override func tableView(tableView: UITableView,didSelectRowAtIndexPath indexPath: NSIndexPath)  {
        let indexPath = tableView.indexPathForSelectedRow
        let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as  UITableViewCell!
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "fromCategorySegue") {
        let vc = segue.destinationViewController as!  TopicsTableViewController
        vc.categories = categories
    }
}

即使我选择第二个类别(汽车),它也会在TopicsTableViewController上显示第一个类别(cat)主题。

如果它有用,这里是我在TopicsTableViewController中的一些代码的片段...

override func tableView(tableView: UITableView, cellForRowAtIndexPath       indexPath: NSIndexPath) -> UITableViewCell {    
    let topic = categories[indexPath.section].topics[indexPath.row]
    let cell = tableView.dequeueReusableCellWithIdentifier("topicCell",forIndexPath: indexPath)
    cell.textLabel?.text = topic

    return cell
}    

我也在TopicsTableViewController的顶部定义了类别,所以我可以根据主题数量获得正确的行数......

var categories = Category.getCategories() 

我想我在didSelectRowAtIndexPath或者我的prepareForSegue中遗漏了一些东西。我认为我的主题是一个在getCategories()函数的一个Category数组中返回的数组这个事实让我搞砸了。

注意: 通过ctrl +从CategoryTableViewController中的单元格拖动到TopicsTableViewController,在Storyboard上创建了CategoryTableViewController和TopicsTableViewController之间的segue。

任何帮助都非常感谢!

谢谢:)

2 个答案:

答案 0 :(得分:2)

如果没有看到全视图控制器,这很难回答。通过查看您发布的代码,似乎所选单元格与准备segue方法之间没有任何关系。例如,您实际使用在didSelectCell方法中创建的变量吗?看起来你没有。在准备segue时,你只是一遍又一遍地展示同样的东西,所以结果很明显是诚实的。

您需要存储所选单元格的索引。然后使用该索引显示数组中的相应数据。像下面这样的东西可能会起作用。需要在类级别创建一个名为indexForCatergoryToShow的变量。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
{
    self.indexForCatergoryToShow = indexPath.row
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{
    if (segue.identifier == "fromCategorySegue") 
    {
        let vc = segue.destinationViewController as! TopicsTableViewController
        vc.categories = categories[indexForCatergoryToShow]
    }
}

答案 1 :(得分:1)

在indexPath中的行的单元格中:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    cell.tag = indexPath.row
    return cell
}

在准备segue时:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "fromCategorySegue") {
        if let cell = sender as? UITableViewCell {
            let row = cell.tag
            // pass data to segue.destination
        }
    }
}

所以你可以知道你选择的是哪个细胞。