Swift 在按钮单击上发送标签文本作为解析对象值

Posted

技术标签:

【中文标题】Swift 在按钮单击上发送标签文本作为解析对象值【英文标题】:Swift Sending Label Text on Button Click as Parse Object Value 【发布时间】:2015-05-04 19:18:32 【问题描述】:

我有一个自定义 tableview 单元格,它显示 Parse 用户个人资料图像、用户名标签和一个按钮,用于将它们添加为我的 Followers 类中的“关注”对象。我的关系设置设置为“关注者”类中的“关注者”作为当前用户的用户名,“关注者”设置为单击“添加朋友”按钮的表格视图单元格的用户名。我目前尝试实现此目的的方式是向设置为indexPath.row 的按钮添加一个标签,然后添加一个目标和IBAction。从那里我将标签视图设置为标签值为1,然后尝试将该标签设置为usernameLabel 变量,我可以使用该变量将其设置为“以下”列。不幸的是,我目前的解决方案following["following"] = usernameLabel.text as PFObject 给了我'UIView? is not convertible to 'PFObject'。这是实现我想要做的事情的最佳方式吗?知道为什么会发生这个错误吗?

这是我的表格视图单元格:

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
    




这是我的表格视图功能。 (注意这是一个带有 tableview 元素的视图控制器):

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 = sender.superview?.viewWithTag(1)

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

        following.saveInBackground()


       /* if let surtv = tableView.objectAtIndex(sender.tag) as? SearchUsersRegistrationTableViewCell 

            surtv.usernameLabel = 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】:

你不应该真的使用标签来尝试像这样导航。我知道这很诱人,但它是作弊并导致这种问题。它还鼓励您将视图用作数据存储,这也是错误的。

您已经拥有自定义单元格类SearchUsersRegistrationTableViewCell,因此您应该利用它。给它一个属性来保存individualUser。现在至少您可以在点击按钮时让用户从单元格中返回。

更好的是在点击按钮时让单元格更新用户,因此您根本不需要回调控制器。

更好的办法是创建一个自定义类,其中包含 individualUser 和应用新追随者并将其提供给自定义单元格的逻辑,然后单元格向该对象询问 individualUser 信息并告诉该对象何时添加关注者。这是知识和逻辑更好的分离。

【讨论】:

以上是关于Swift 在按钮单击上发送标签文本作为解析对象值的主要内容,如果未能解决你的问题,请参考以下文章

在按钮上单击清除显示的文本并在 VueJs 中调用另一个函数

在iphone中单击按钮时如何将文本字段/标签中的值添加到数组中

swift:如何在单击按钮上对所有单元格进行 TTS

设计一个程序,在文本框中输入一个3位整数,单击按钮后,在标签上输出该数的百位数、十位数和个位数

iOS Swift标签框高度未正确更新

如何在 Swift 中的 UITableViewCell 上添加带有单击事件的按钮?