如何根据点击的 UITableCell 更改目标视图控制器的内容?

Posted

技术标签:

【中文标题】如何根据点击的 UITableCell 更改目标视图控制器的内容?【英文标题】:How to change content of the destination view controller according to tapped UITableCell? 【发布时间】:2015-09-13 09:15:22 【问题描述】:

我有两个视图控制器 UITableViewControllerDestinationViewControllerDestinationViewController 的内容应该根据点击的 UITableViewCell 改变。我试过this 教程,但这个没有意义。如何确定点击了哪个单元格以及点击单元格时如何执行 segue?

编辑:

UITableViewController:

let days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

var myIndex: Int?
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    table1View.deselectRowAtIndexPath(indexPath, animated: true)
    myIndex = indexPath.row
    self.performSegueWithIdentifier("showClassesForSchedule", sender: nil)


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if let identifier = segue.identifier 
        switch identifier 
        case "showClassesForSchedule":
            let destinationViewController = segue.destinationViewController as? ScheduleAsClassTableViewController// set here нour destionation VC
            if destinationViewController != nil 
                destinationViewController?.tableArray.append(days[myIndex!])
                destinationViewController?.tableArray = days
                print(days[myIndex!])
            
        default: break
        
    



func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    return 1


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return days.count


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("scheduleDaysTextCellIdentifier", forIndexPath: indexPath) as UITableViewCell

    let row = indexPath.row
    cell.textLabel?.text = days[row]

    return cell

目标视图控制器:

    var tableArray = [String]()
    @IBOutlet var table1View: UITableView!
    override func viewDidLoad() 
        super.viewDidLoad()
        print(tableArray)
    
    @IBOutlet weak var comingLabelAsNormalView: UILabel!

    @IBOutlet weak var comingName: UILabel!

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        // #warning Incomplete implementation, return the number of sections
        return 1
    

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        // #warning Incomplete implementation, return the number of rows
        return tableArray.count
    

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = table1View.dequeueReusableCellWithIdentifier("scheduleDayClassIdentifier", forIndexPath: indexPath) as UITableViewCell

        let row = indexPath.row
        cell.textLabel?.text = tableArray[row]

        return cell
    

【问题讨论】:

【参考方案1】:

您可以在 tableView didSelectRowAtIndexPath 中执行 segue。然后在 prepareForSegue 方法中设置你的 destinationVC 并传递所需的数据。

代码:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if let identifier = segue.identifier 
        switch identifier 
        case "yourSegueIdentifier":
            let destinationViewController = segue.destinationViewController as? UIViewController // set here нour destionation VC
            if destinationViewController != nil 
                destinationViewController?.passedData = yourData
            
        default: break
        
    

不要忘记创建一个 segue 并设置标识符。如果您有任何问题,请在 cmets 中提问。

这是你的 tableView didSelectRowAtIndexPath:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
    // save indexPath to any Int variable
    myIndex = indexPath.row
    self.performSegueWithIdentifier("yourSegueIndentifier", sender: nil)

【讨论】:

我需要在哪个函数中执行segue? 当您说 perfromSegueWithIdentifier 时,它会调用 prepareForSegue 方法,您可以在其中根据 indexPath.row 设置数据 我在您的帖子中导入了代码,但我遇到了问题。问题是,在prepareForSegue 函数中,我传递了已点击的按钮名称。但是在目标视图控制器中,我打印了传递的数据并且我得到了 nil.?? 在你的prepareForSegue方法中你说destinationViewController?.tableArray.append(days[myIndex!])destinationViewController?.tableArray = days你确定要这样做吗?如果您只想通过选定的日期,您只需留下这一行:destinationViewController?.day = days[myIndex!] 别忘了在 DestinationViewController 中创建String 变量。 var day: String!【参考方案2】:

有几种方法可以做到这一点。我建议使用segues。此方法不需要需要didSelectRowAtIndexPath

首先,通过右键单击并从原型单元拖动到下一个视图控制器并选择Show来创建一个segue:

然后给segue一个标识符:

接下来,您需要引用被点击的特定单元格的索引路径。您可以在prepareForSegue 中执行此操作。试试这样的:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if segue.identifier == "detail" 
        if let cell = sender as? UITableViewCell
            if let indexPath = self.tableView.indexPathForCell(cell) 
                // get a reference to the next view controller so you can pass data in
                var nvc = segue.destinationViewController as! NewViewController

                // set properties on the next view controller using the acquired cell's index
                nvc.name = names[indexPath.row]
            
        
    

上面的代码检查segue标识符。 sender 在这种情况下是用户点击的 UITableViewCell。接下来的两行尝试获取对此单元格及其关联的indexPath 的引用。然后,您可以在 segue 之前根据需要使用indexPath.rowindexPath.section 以访问相关数据。然后获得对下一个视图控制器的引用(您应该为它创建一个关联的类并将其连接到界面生成器中),然后可以在此引用上设置您想要设置的任何属性。

【讨论】:

以上是关于如何根据点击的 UITableCell 更改目标视图控制器的内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据按钮的点击事件提供此功能的不同道具?

如何制作可拉伸的自定义 UITablecell

关于如何将 UIview 作为子视图添加到 UITableCell 的问题

如何将 UIViewController 实例传递给自定义 UITableCell

iPhone 开发:滑动 UITableCell

如何使用 swift 填充我放置在 UITableCell 中的整个 UIScrollView