将数据从 UITableViewCell 可可触摸类传输到 UIViewController 类

Posted

技术标签:

【中文标题】将数据从 UITableViewCell 可可触摸类传输到 UIViewController 类【英文标题】:Transferring data from a UITableViewCell cocoa touch class to a UIViewController class 【发布时间】:2016-12-04 18:21:56 【问题描述】:

好的,所以我实际上要做的是将数据从 UITableViewCell 类传输到 UIViewController 类。下面是我的 UITableViewCell:

class OrderCell: UITableViewCell 

override func awakeFromNib() 
    super.awakeFromNib()



var post: OrderModel!
var link: Link!

var addedList: [String:Float] = [:]


@IBOutlet weak var dishName: UILabel!
@IBOutlet weak var dishDescriptionAndPrice: UILabel!
@IBOutlet weak var numberOfOrders: UILabel!
@IBOutlet weak var addOrderBtn: UIButton!
@IBOutlet weak var subtractOderBtn: UIButton!

@IBAction func addButtonPressed(sender: AnyObject) 
    if numberOfOrders.text == "9" 
        numberOfOrders.text = "9"
     else 
        numberOfOrders.text = String((Int(numberOfOrders.text!)! + 1))
    
    addedList.updateValue(post.dishPrice, forKey: post.dishName)
    print(addedList)


@IBAction func subtractButtonPressed(sender: AnyObject) 
    if numberOfOrders.text == "0" 
        numberOfOrders.text = "0"
     else 
        numberOfOrders.text = String((Int(numberOfOrders.text!)! - 1))
    


func getOrders() -> Dictionary<String, Float> 
    return addedList



func configureCell(post: OrderModel) 
    self.post = post
    self.dishName.text = post.dishName
    self.dishDescriptionAndPrice.text = post.dishDescription
    self.numberOfOrders.text = "0"



我想要做的是让我的另一个类(属于 UIViewController),从上面的类中检索 'addedList'。我显然不能使用 prepareForSegue,而且我没有运气找到一种与这两个类兼容的方法。我愿意创建一个新类作为两者之间的“桥梁”并通过它传输数据,但我再次找不到这样做的方法。非常感谢任何和所有帮助,在此先感谢您。

更具体地说,UIViewController 包含我的 tableview,上面的类只是每个单独单元格的目标文件。我需要在调用 addButtonPressed IBaction 时传输数据。

【问题讨论】:

你的 UIViewController 是包含你的表格视图的类吗? 2之间有什么联系?您想什么时候从单元格中检索“addList”?何时选择单元格? 感谢您的回复。我已在底部更新了我的问题以回答这些问题。 【参考方案1】:

您可以通过在您的单元类中创建一个委托来做到这一点。在您的视图控制器类中,在 indexPath 的行单元格下,添加:

cell.delegate = self

并像这样更新您的单元格:

 protocol ClassNameDelegate:class 
      func addButtonAction(addedList:[String:Float])
    

        @IBOutlet weak var dishName: UILabel!
        @IBOutlet weak var dishDescriptionAndPrice: UILabel!
        @IBOutlet weak var numberOfOrders: UILabel!
        @IBOutlet weak var addOrderBtn: UIButton!
        @IBOutlet weak var subtractOderBtn: UIButton!


        //Create a delegate

       weak var delegate: ClassNameDelegate?

        @IBAction func addButtonPressed(sender: AnyObject) 
            if numberOfOrders.text == "9" 
                numberOfOrders.text = "9"
             else 
                numberOfOrders.text = String((Int(numberOfOrders.text!)! + 1))
            
            addedList.updateValue(post.dishPrice, forKey: post.dishName)
            print(addedList)

            // Call this when added list is done and get the call to your view controller.

            if delegate != nil 
               delegate?.addButtonAction(addedList: addedList)
            
        

        @IBAction func subtractButtonPressed(sender: AnyObject) 
            if numberOfOrders.text == "0" 
                numberOfOrders.text = "0"
             else 
                numberOfOrders.text = String((Int(numberOfOrders.text!)! - 1))
            
        

        func getOrders() -> Dictionary<String, Float> 
            return addedList
        


        func configureCell(post: OrderModel) 
            self.post = post
            self.dishName.text = post.dishName
            self.dishDescriptionAndPrice.text = post.dishDescription
            self.numberOfOrders.text = "0"
        

        

最后在你的视图控制器类中导入这个委托方法,就像你导入 tableView 委托和数据源一样。

【讨论】:

这给了我一个错误,我的 UIViewControllerClass 不符合协议 'ClassNameDelegate' 您是否在视图控制器类中导入了这个方法:func addButtonAction(addedList:[String:Float])? 您应该熟悉协议并遵守它们,这是您编写的语言的基础...... 这很完美,正是我想做的。非常感谢。【参考方案2】:

单元格不是存储此类信息的好地方。您应该将信息存储在视图控制器中。当您按下单元格按钮时,通过单元格的索引路径检索信息。

在你的牢房里:

func configureCell(post: OrderModel, delegate:UIViewController) 
    self.dishName.text = post.dishName
    self.dishDescriptionAndPrice.text = post.dishDescription
    self.numberOfOrders.text = "0"
    self.addButton.addTarget(delegate, action: #selector(delegate.addButtonPressed(_:)), for: UIControlEvents.touchUpInside)

在您的视图控制器中:

//store your data in your view controller
var data=[OrderModel]()

func addButtonPressed(_ button:UIButton)
    let selectedCell=button.superview?.superview? as! OrderCell
    let indexPath=tableView.indexPath(for: selectedCell)
    let cellData=data[indexPath!.row]

    if cellData.numberOfOrders==9
        selectedCell.numberOfOrders.text="9"
    else
        selectedCell.numberOfOrders.text=String(cellData.numberOfOrders+1)
    

【讨论】:

感谢您的回复。 'UIControlEvents' 没有成员 'touchUpInside' 似乎给了我一个错误 奇怪,你是用 Swift 3 编码的吗? 当你开始打字时,它会给你什么建议?

以上是关于将数据从 UITableViewCell 可可触摸类传输到 UIViewController 类的主要内容,如果未能解决你的问题,请参考以下文章

无法将 UITableViewCell 设置为单元格

如何将触摸从 UITextView 传递到 UITableViewCell

有没有办法在可可触摸中获得或计算真北?

带有可可触摸的 Objective-C 中的表存储

可可触摸:如何找出被触摸的对象

如何从 UITableViewCell 中的自定义 UIButton 中删除触摸延迟