使用swift在UITableView中添加UIButton(跟随按钮)

Posted

技术标签:

【中文标题】使用swift在UITableView中添加UIButton(跟随按钮)【英文标题】:Adding UIButton (follow button) in UITableView using swift 【发布时间】:2015-08-08 10:16:56 【问题描述】:

所以这是我的问题。我从 Parse 中的 _User 类中检索了用户数据,并在应用程序中显示如下:

var data:NSMutableArray = NSMutableArray()


func loadData() 

    data.removeAllObjects()

    var userQuery = PFUser.query()
        userQuery?.orderByAscending("createdAt")
        userQuery?.findObjectsInBackgroundWithBlock( (objects, erroe) -> Void in

            if let objects = objects 

                for object in objects 

                    if let user = object as? PFUser 

                        if user.objectId != PFUser.currentUser()?.objectId 

                            self.data.addObject(object)



                        

                        self.tableView.reloadData()


                    

                
             
        )


override func viewDidLoad() 
    super.viewDidLoad()

    loadData()



override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()



// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    // #warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 1


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




override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let myCell = tableView.dequeueReusableCellWithIdentifier("users", forIndexPath: indexPath) as! userListTableViewCell

    let userData:PFObject = self.data.objectAtIndex(indexPath.row) as! PFObject

    // Usernames and gender..

    myCell.fullName.text = userData.objectForKey("fullName") as! String!
    myCell.genderLabel.text = userData.objectForKey("gender") as! String!

    // Profile pictures..

    let profilePics = userData.objectForKey("profilePicture") as! PFFile
    profilePics.getDataInBackgroundWithBlock  (data, error) -> Void in

        if let downloadedImage = UIImage(data: data!) 

            myCell.dp.image = downloadedImage
        

    
    return myCell

现在我想添加一个关注按钮来关注特定用户并希望在 Parse 中保存该数据。所以我的问题是:

    如何有效地添加关注按钮,如果有这么多用户,这不会搞砸事情。我试过给他们tag,比如myCell.followButton.tag = indexPath.row,但效果很好。所以我想知道实现目标的其他方法。

    在 Parse 中保存关注者列表的最佳方法是什么。我正在考虑创建一个名为 Followers 的类,其中包含 user 列:被关注的用户和 follower 我们在其中可以添加 PFUser.currentUser().objectId 。有什么比这更好的吗?或者这是一个不错的方法?

这是我的userListTableViewController..的屏幕截图。

在这里你可以看到我已经连接到userListTableViewCell的followButton..请帮帮我..谢谢你的时间..

【问题讨论】:

【参考方案1】:

让那个按钮变成你想要的 UILabel,然后给它添加一个 UIGestureRecognizer,像这样

创建一个名为PFUserTapGestureRecognizer.swift的swift文件

import UIKit

class PFUserTapGestureRecognizer: UITapGestureRecognizer

    var tapper: PFUserTapper

    init(id: Int, onTap: (id: Int) -> Void)
    
        self.tapper = PFUserTapper()
        self.tapper.id = id
        self.tapper.onTap = onTap
        super.init(target: self.tapper, action: Selector("userTapped"))
    


class PFUserTapper : NSObject

    var id = 0
    var onTap: ((idUse: Int) -> Void)?

    func userTapped()
    
        onTap?(idUser: id)
    

现在,当您在要加载 UITableView 的视图控制器中加载单元格时,在委托 tableView:cellForRowAtIndexPath: 中,执行以下操作:

// Check if you are following that user already
// if im NOT following this user then

    let idUser = userData.objectForKey("id") as! Int
    myCell.labelFollow.tag = idUser
    myCell.labelFollow.text = "Follow"
    addFollowBehavior(follow: true, idUser: idUser, label: myCell.labelFollow)

// else if i'm following the user

    myCell.labelFollow.text = "Unfollow"
    addFollowBehavior(follow: false, idUser: idUser, label: myCell.labelFollow)

// else.. you should consider the case when you click Follow and it takes time to get an answer from your service

并创建这个函数

func addFollowBehavior(follow follow: Bool, idUser: Int, label: UILabel) 

    if let recognizers = label.gestureRecognizers 
        for recognizer in recognizers 
            label.removeGestureRecognizer(recognizer as! UIGestureRecognizer)
        
    
    label.addGestureRecognizer(PFUserTapGestureRecognizer(idUser, 
        onTap:  (idUser) -> Void in
            // THIS IS WHERE YOU SAVE TO PARSE, WEB SERVICE OR WHATEVER
            // if follow then 
                // Do Follow 
            // else 
                // UnFollow... 

            // On the callback write this to protect from reused cells:
            if label.tag = idUser 
                myCell.labelFollow.text = follow ? "Unfollow" : "Follow" // NOW (UN)FOLLOWING!
                addFollowBehavior(follow: !follow, idUser: idUser, label: myCell.labelFollow)
            
        
    )

我没有机会测试它,但我有一个非常相似的实现来满足这样的需求,而且效果很好

注意:如果后续项目是 UIImageView 或继承自 UIView 的任何内容以更酷的外观,则此方法有效,您无需更改文本,而是更改 UIImage

【讨论】:

你是如何获得关于已经被关注的用户的信息的?您能否编辑您的答案以说明我应该在哪里编写所有代码(在哪个视图控制器中)以获得更多解释?谢谢 您应该将您已经关注的用户的信息保存在某处,并且您添加到单元格的代码非常清晰(我还是编辑了它),在您显示的视图控制器中使用它UITableView,我没有误解你有一个 UIButton,我实际上是建议你把它变成一个 UILabel 或 UIImageView,而不是 我的@IBOutlet var followButtton: UIButton! 中有UITableViewCell我需要在这里更改什么吗?? 就像您将按钮添加到界面,然后将其链接到您的类,但使用 UILabel 执行相同操作 你能用关注者数据更新它吗?因为这段代码有很多错误:/

以上是关于使用swift在UITableView中添加UIButton(跟随按钮)的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 2.0 中将图像添加到 UITableView

如何在 Swift 3 中以编程方式在 UIImageview 中添加 UITableview

Swift:将包含自定义标签的单元格添加到 UITableView

如何在 Swift 4 中向 UIView 添加子视图?

在 UITableView 中重新排序单元格会取消 Swift 中单元格的功能?

如何在 swift 中增加 ScrollView 中的 UITableView 高度