Swift 将按钮操作添加到 TableView 单元格

Posted

技术标签:

【中文标题】Swift 将按钮操作添加到 TableView 单元格【英文标题】:Swift Adding Button Action to TableView Cell 【发布时间】:2015-05-01 13:57:38 【问题描述】:

我正在尝试在我的自定义 tableview 单元格中创建一个按钮,该按钮具有创建 Parse 类的操作(如果尚未创建)并将按钮单击的行的标签文本应用为值对于“following”列,并将“follower”列值设置为当前登录用户的用户名。目前,我在 addUser IBAction 中的 let usernameLabel 处出现错误,表明我的类没有名为 objectAtIndex 的成员。实现我的目标的最佳方法是什么?

我在 SearchUsersRegistrationTableViewCell.swift 中创建了网点

import UIKit

class SearchUsersRegistrationTableViewCell: UITableViewCell 

    @IBOutlet var userImage: UIImageView!
    @IBOutlet var usernameLabel: UILabel!
    @IBOutlet weak var addUserButton: UIButton!


    override func awakeFromNib() 
        super.awakeFromNib()

        userImage.layer.borderWidth = 1
        userImage.layer.masksToBounds = false
        userImage.layer.borderColor = UIColor.whiteColor().CGColor
        userImage.layer.cornerRadius = userImage.frame.width/2
        userImage.clipsToBounds = true


    

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

        // Configure the view for the selected state
    




这是我的表格功能以及我尝试应用到我的addUserButton 的操作:

import UIKit

class SearchUsersRegistrationViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 


    var userArray : NSMutableArray = []


    @IBOutlet var tableView: UITableView!

    override func viewDidLoad() 
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self

        loadParseData()

        var user = PFUser.currentUser()




    

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


    func loadParseData() 

        var query : PFQuery = PFUser.query()

        query.findObjectsInBackgroundWithBlock 
            (objects:[AnyObject]!, error:NSError!) -> Void in

            if error == nil 

                if let objects = objects 

                    println("\(objects.count) users are listed")

                    for object in objects 

                        self.userArray.addObject(object)

                    
                    self.tableView.reloadData()
                
             else 
                println("There is an error")
            
        
    



    let textCellIdentifier = "Cell"

    func numberOfSectionsInTableView(tableView: UITableView) -> Int 

        return 1

    

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

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

        let cell = tableView.dequeueReusableCellWithIdentifier(textCellIdentifier, forIndexPath: indexPath) as! SearchUsersRegistrationTableViewCell

        let row = indexPath.row

        var individualUser = userArray[row] as! PFUser
        var username = individualUser.username as String

        var profileImage = individualUser["profileImage"] as! PFFile

        profileImage.getDataInBackgroundWithBlock(
            (result, error) in

            cell.userImage.image = UIImage(data: result)

        )

        cell.usernameLabel.text = username

        cell.addUserButton.tag = row

        cell.addUserButton.addTarget(self, action: "addUser:", forControlEvents: .TouchUpInside)

        return cell

    


    @IBAction func addUser(sender: UIButton)

        let usernameLabel = self.objectAtIndex(sender.tag) as! String

        var following = PFObject(className: "Followers")
        following["following"] = usernameLabel.text
        following["follower"] = PFUser.currentUser().username //Currently logged in user

        following.saveInBackground()
    

    @IBAction func finishAddingUsers(sender: AnyObject) 
        self.performSegueWithIdentifier("finishAddingUsers", sender: self)

    


【问题讨论】:

【参考方案1】:

我假设 usernameLabel 与 UIButton 发送者在同一个 contentView 上。如果是这种情况,您可以将标签添加到 usernameLabel 并执行此操作

let usernameLabel = sender.superview.viewWithTag(/*Put tag of label here*/)

我在手机上,所以我不知道 viewWithTag 是否是该方法的正确名称,但它是类似的。

希望这会有所帮助。

【讨论】:

嘿@Tobias,感谢您的回答。对不起,我对你的/*Put tag of label here*/ 感到困惑,你的意思是按钮插座,它有一个标签方法? 因此您可以将 Int 值与任何视图 someView.tag = 10 相关联。然后您可以稍后找到带有标签aSuperview.viewWithTag(10) 的视图。您还可以在情节提要或 xib 中设置此值,方法是选择视图并转到 Attributes Inspect (option+cmd+4),然后转到 View 部分,在 Mode 下拉菜单下应该有一个 Tag 文本字段。所以我会在你试图获取和使用的 usernameLabel 上设置标签。 嘿@Tobias,现在对我来说更有意义了。所以我在情节提要中选择了我的标签并将该标签的值更改为 1。在我的代码中,我现在使用 let usernameLabel = sender.superview?.viewWithTag(1) 之后,我想获取该标签文本值并将其设置为我的以下 ["following"] = usernameLabel`目的。当我尝试使用usernameLabel.text 时,它似乎是不可能的,当我只运行following["following"] = usernameLabel 时,我得到一个错误,`NSInvalidArgumentException,原因:'PFObject 值可能没有类:UILabel'。我正在尝试将标签的文本设置为值。 很高兴知道您正在取得进展。您现在可以访问 usernameLabel UILabel 对象。现在您正尝试通过 followers["following"] = usernameLabel.text 将 usernameLabel.text 字符串值与您的 Parse 对象相关联。您收到的错误意味着 Followers 类的 Parse 对象不接受 String 值。您需要确定它期望的类型并分配该类型的值。它是否期望 PFObject 类用户?它需要一个字符串数组吗?回答完这个问题后,您需要将用户名字符串转换为该类型。 是的,这需要作为 PFObject,除非您熟悉 Parse,否则您可能很难回答,但是当我设置 following["following"] = usernameLabel as PFObject 时,我收到错误 'UIView?' is not convertible to 'PFObject'following["following"] = usernameLabel.text as PFObject给我Cannot assign a value of type 'PFObject' to a value of type 'AnyObject'【参考方案2】:

您收到错误是因为您使用的是self 而不是tableView

let usernameLabel = self.objectAtIndex(sender.tag) as! String
let usernameLabel = tableView.objectAtIndex(sender.tag) as! String

但是,这仍然会给您一个错误,因为 UITableViewCell 不能转换为 String。 这是一个更好的选择:

if let surtvc = tableView.objectAtIndex(sender.tag) as? SearchUsersRegistrationTableViewCell 
    // surtvc.usernameLabel...
    // the rest of your code goes here

【讨论】:

嘿@Allen Chau,感谢您的回答。我收到代码的 objectAtIndex 部分错误。也许这不是这个陈述的正确方法。错误:SearchUsersRegistrationViewController does not have a member names 'objectAtIndex' @cphill 该错误是因为 ViewController 没有该方法。它有loadParseDataaddUser:等方法 @cphill 哦,对不起,我假设您使用的是基于方法的 UITableViewController。不是这样吗? 嘿@AllanChau 我正在使用带有tableview 的UIViewController。我计划将搜索添加到视图控制器,这就是我不想使用 UITableViewController 的原因。 @cphill 这可以很容易地添加使用 UISearchController 或 UITableViewController 与 Textfield 作为搜索栏。无论如何,我已经更新了上面的答案,应该可以回答您的问题。 :]

以上是关于Swift 将按钮操作添加到 TableView 单元格的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 的 swift 中将浮动操作按钮放在 tableView 中?

Swift-使用委托将数据附加到 CollectionView 中的 TableView

选择器值到 tableView swift

如何以编程方式将不同单元格的不同图像添加到 tableView (Swift)

如何以编程方式将不同单元格的不同图像添加到 tableView (Swift 3)

如何在 Swift 中将绘图保存到 tableview?