UITableViewCell按钮不是可点击的IOS Swift

时间:2016-07-28 19:07:04

标签: ios swift uitableview swift2 interface-builder

所以基本上我试图这样做:

我有一个TableView,我将自定义单元格(xib)加载到其中。此自定义单元格具有自己的相应自定义类。单元格加载得很好,但按钮不可点击(完全没有,因为你甚至看不到按钮被点击的任何类型的指示)。我做了一些谷歌搜索,试图在单元格中设置动作,尝试使用委托来处理动作。我迷路了。

以下是文件中的代码:

ViewController.swift

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        // Use your cell's reuse identifier and cast the result
        // to your custom table cell class.
        let cell = tableView.dequeueReusableCellWithIdentifier("ReserveTableViewCell", forIndexPath: indexPath) as! ReserveTableViewCell

        cell.delegate = self

        let button = cell.locationButton.viewWithTag(1) as? UIButton
        button?.addTarget(self, action: #selector(ReserveTableViewController.loc(_:)), forControlEvents: .TouchUpInside)

        cell.pickupDate.text = "Today"
        cell.returnDate.text = "Tomorrow"

        //cell.locationButton.addTarget(self, action: #selector(loc), forControlEvents: .TouchUpInside)


        return cell
    }

func loc(sender: UIButton!) {
    print("here")
}

CustomCell.swift

import UIKit


protocol ReserveTableViewCellDelegate {
    func pickupLocationClick(cell: ReserveTableViewCell)
}

class ReserveTableViewCell : UITableViewCell {
    @IBOutlet weak var searchButton: UIButton!
    @IBOutlet weak var compactIcon: UIImageView!
    @IBOutlet weak var midsizeIcon: UIImageView!
    @IBOutlet weak var suvIcon: UIImageView!
    @IBOutlet weak var luxuryIcon: UIImageView!
    @IBOutlet weak var sportIcon: UIImageView!
    @IBOutlet weak var pickupIcon: UIImageView!
    @IBOutlet weak var pickupDate: UILabel!
    @IBOutlet weak var returnDate: UILabel!
    @IBOutlet weak var locationButton: UIButton!

    var delegate: ReserveTableViewCellDelegate?

    @IBAction func locationButtonAction(sender: AnyObject) {
        delegate?.pickupLocationClick(self)
    }


    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

某些代码仍然来自其他尝试(这就是协议方法与viewcontroller.swift文件中现在定义的“loc”不匹配的原因。

在我的故事板中的TableView中,我选择关闭,当它打开时,你在单元格上选项卡使它看起来都很“昏暗”。

我在tableview中设置了自定义类,并且出口/操作在IB中链接。

任何?

3 个答案:

答案 0 :(得分:1)

根据我的经验,可以在Cell文件和ViewController文件(将TableView作为成员保存)中为按钮添加功能

<强> ViewController.swift

@IBAction func locationButtonAction(sender: AnyObject) {
    // Do Some Action Here (Which interacts with data members of View
}

<强> CustomCell.swift

@IBAction func locationButtonAction(sender: AnyObject) {
    // Do Another Action (Which interacts with data members of the cell)
}

这两个功能都可以使用Storyboard Editor链接到Cell按钮的TouchUpInside!

祝你好运!

答案 1 :(得分:0)

在这里结合令人困惑的事情......

let button = cell.locationButton.viewWithTag(1) as? UIButton

这意味着,嘿locationButton,在你的子视图中查找viewWithTag为1.不是你想要的。只需使用

let button = cell.locationButton

然后,您需要确定您正在调用的操作以及它所在的类。如果您希望按钮在ViewController类中调用操作,则添加一个目标,如:

button.addTarget(self, action: #selector(ViewController.loc(_:)), forControlEvents: .TouchUpInside)

如果你想让按钮在ReserveTableViewController类中调用一个动作,这真的很奇怪,你需要一种方法来引用该类

button.addTarget(myReferenceToTheReserveTableViewControllerClass, action: #selector(ReserveTableViewController.loc(_:)), forControlEvents: .TouchUpInside)

您实际上可能正在寻找的是按钮调用单元格类中的方法,然后您可以根据需要进行响应或委托给另一个类,然后是:

button.addTarget(cell, action: #selector(ReserveTableViewCell.loc(_:)), forControlEvents: .TouchUpInside)

答案 2 :(得分:0)

我和你一样设置了项目。我在 ViewController.swift 中注意到的一件事是您编写了以下代码。

let button = cell.locationButton.viewWithTag(1) as? UIButton //If you will print or debug this button you will see nil
print("Button: \(button)") //prints "Button: nil"
button?.addTarget(self, action: #selector(ReserveTableViewController.loc(_:)), forControlEvents: .TouchUpInside)

以上代码不会为您的Button添加目标。它为你的Buttons子视图添加了标记值为1的目标。实际上是nil。请尝试以下代码。

cell.locationButton.addTarget(self, action: #selector(ReserveTableViewController.loc(_:)), forControlEvents: .TouchUpInside)(self, action: #selector(clicked), forControlEvents: .TouchUpInside)

在ViewController.swift中尝试以下代码

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    // Use your cell's reuse identifier and cast the result
    // to your custom table cell class.
    let cell = tableView.dequeueReusableCellWithIdentifier("ReserveTableViewCell", forIndexPath: indexPath) as! ReserveTableViewCell

    cell.delegate = self

    //let button = cell.locationButton.viewWithTag(1) as? UIButton
    //button?.addTarget(self, action: #selector(ReserveTableViewController.loc(_:)), forControlEvents: .TouchUpInside)
    cell.locationButton.addTarget(self, action: #selector(loc), forControlEvents: .TouchUpInside)

    cell.pickupDate.text = "Today"
    cell.returnDate.text = "Tomorrow"


    return cell
}
func loc(sender: UIButton!) {
    print("here")
}