Tableview像Snapchat发送功能(多选和可刷标签)

时间:2017-08-21 03:00:33

标签: ios swift xcode uitableview swift3

在我的Xcode项目中,我想要像Snapchat的“发送到...”屏幕一样有类似的视图(我附上了截图)。我已经制作了一个tableview并填充它并允许多个选择。我目前遇到两件事情有困难:

1)多重选择:我可以选择我想要的单元格,但是当我点击搜索栏并开始输入时,我之前的所有选择都会消失。我假设我需要在数组中添加所有名称,并以某种方式将数组与表进行通信,以便显示此用户名是否在数组中,然后在tableview中选中它。但我不知道该怎么做。 我该怎么做?

2)发送到底栏(照片中的蓝色)如您所知,在Snapchat中按下您要将快照发送给哪些用户时,他们的名字会添加到栏中在底部,当你填满栏时,它因为可以在你可以水平滚动你添加的名字的地方滑动。我可以将名称附加到数组并将数组显示在像他们这样的标签中,但我不知道如何制作它以便用户可以横向滚动它。 如何实现这个相同的功能?

随意回答任何问题!你不需要做所有这些,我只需要他们回答。到目前为止,这是我的代码:

class User {        
        var userID:String?
        var userFullName:String?
        var userUsername:String?
        var userProfileImage:PFFile?
        var isPrivate:Bool

        init(userID : String, userFullName : String, userUserName : String, userProfileImage : PFFile, isPrivate : Bool) {
            self.userID = userID
            self.userFullName = userFullName
            self.userUsername = userUserName
            self.userProfileImage = userProfileImage
            self.isPrivate = isPrivate
        }
    }

var userArray = [User]()
    func loadFriends() {
            //STEP 1: Find friends
            let friendsQuery = PFQuery(className: "Friends") //choosing class
            friendsQuery.whereKey("friendOne", equalTo: PFUser.current()?.objectId ?? String()) //finding friends
            friendsQuery.limit = self.page //number of users intitally showing
            friendsQuery.findObjectsInBackground (block: { (objects, error) -> Void in
                if error == nil { //if no error

                    //clean up
                    self.friendsArray.removeAll(keepingCapacity: false)

                    //STEP 2: Find related objects depending on query setting
                    for object in objects! {
                        self.friendsArray.append(object.value(forKey: "friendTwo") as! String) //hold array info of friend
                    }

                    //STEP 3: Find friend info
                    let query = PFUser.query()
                    query?.whereKey("objectId", containedIn: self.friendsArray) 
                    query?.addDescendingOrder("createdAt") //how to order users
                    query?.findObjectsInBackground(block: { (objects, error) -> Void in
                        if error == nil {

                            for object in objects! {                            
                                var user : User

                            let fullname = (object.value(forKey: "fullname") as! String)
                            let username = (object.object(forKey: "username") as! String)
                            let profilePhoto = (object.object(forKey: "profilePhoto") as! PFFile)
                            let objectID = (object.objectId!)
                            let isPrivate = (object.object(forKey: "isPrivate") as! Bool)

                            user = User(userID: objectID, userFullName: fullname, userUserName: username, userProfileImage: profilePhoto, isPrivate: isPrivate)
                            self.userArray.append(user)
                            }
                            self.tableView.reloadData()
                        } else {
                            print(error!)
                        }
                    })
                } else {
                    print(error!)
                }
            })
        }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! FriendCell
            let user = userArray[indexPath.row]

        //add user info to cells
        cell.fullnameLabel.text = user.userFullName
        cell.usernameLabel.text = user.userUsername
        cell.objectID = user.userID!
        cell.isPrivate = user.isPrivate
        user.userProfileImage?.getDataInBackground (block: { (data, error) in
            if error == nil {
                cell.profilePhoto.image = UIImage(data: data!)
            }             
        })                
                })
    }

enter image description here

2 个答案:

答案 0 :(得分:1)

1)多项选择: 您应该拥有一个包含用户属性的User类(例如User),而不是为每个属性维护array。将用户对象存储在Array中。用户类可能如下所示:

    class User {

    var userID:String
    var userFullName:String
    var userName:String
    var userProfileImageUrl:String

    init(userID:String,userFullName:String,userName:String,userProfileImageUrl:String) {
        self.userID = userID
        self.userFullName = userFullName
        self.userName = userName
        self.userProfileImageUrl = userProfileImageUrl
    }
}

您可以使用User扩展来检查是否选择了该用户(例如,isSelected)。

import UIKit
import Foundation

private var selectedKey: UInt8 = 0
extension User {
    var isSelected:Bool{
        get {
            return objc_getAssociatedObject(self, &selectedKey) as! Bool
        }
        set {
            objc_setAssociatedObject(self, &selectedKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}

现在在func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell检查user.isSelected == true/false并相应地更新您选择/取消选择的图片。 并在isSelected

中更新func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)的值

2)发送到底栏: 对于底栏,在UICollectionView中添加UIView作为子视图。创建一个覆盖UICollectionViewCell的{​​{1}}覆盖的类。您可以在UILabel中添加flow layout

我已经给出了一个想法。希望它会帮助你。

答案 1 :(得分:0)

我认为,你为tableView中的每个单元格设置了bool检查。如果再次加载单元格,则不会显示检查。因为,它检查是假的。