在我的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!)
}
})
})
}
答案 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检查。如果再次加载单元格,则不会显示检查。因为,它检查是假的。