Tableview 像 Snapchat 发送功能(多选和可滑动标签)
Posted
技术标签:
【中文标题】Tableview 像 Snapchat 发送功能(多选和可滑动标签)【英文标题】:Tableview Like Snapchat Send Feature (Multiple Selection and Swipeable Label) 【发布时间】:2017-08-21 03:00:33 【问题描述】:在我的 Xcode 项目中,我希望有一个类似 Snapchat 的“发送到...”屏幕的视图(我附上了截图)。我已经制作了一个表格视图并填充它并允许进行多项选择。我目前在两件事上遇到问题:
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!)
)
)
【问题讨论】:
【参考方案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
您可以有一个用户扩展来检查该用户是否被选中(例如 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
并相应地更新您选择/取消选择的图像。
并更新func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
中isSelected
的值
2) 发送到底部栏:
对于底部栏,添加 UICollectionView
作为 UIView
中的子视图。创建一个覆盖UICollectionViewCell
的类,该类包含UILabel
。您可以在UICollectionView
中添加flow layout
。
我只是给出了一个开始的想法。希望它会对你有所帮助。
【讨论】:
如何准确地使用用户类?我是一个新手编码器,以前没有使用过这个。我已经在代码中输入了您的class User...
,但是当我转到 loadfriends()
函数时,我无法将任何对象添加到类中
正如我所说的,我刚刚给了你一个开始的想法。如果它对您有帮助,您应该接受我的回答,以便我可以进一步帮助您。
我已接受您的回答并希望得到您的帮助。如何添加从loadFriends()
函数收到的数据?
我也更新了我的答案。你可以这样尝试:for object in objects! var user:User = User(object.objectId!,object.value(forKey: "fullname") as! String,object.object(forKey: "username") as! String,object.object(forKey: "profilePhoto") as! String) self.userArray.append(user)
啊,我已经实现了您的代码,并且表格视图加载了我的用户。我将尝试多项选择,我会尽快回复您。但与此同时,我想按全名的字母顺序组织我的用户。上课怎么可能?【参考方案2】:
我认为,您为 tableView 中的每个单元格设置布尔检查。如果单元格再次加载,它将不会显示检查。因为,它检查是假的。
【讨论】:
以上是关于Tableview 像 Snapchat 发送功能(多选和可滑动标签)的主要内容,如果未能解决你的问题,请参考以下文章
在 xcode 中使用 tableview 创建注册表单(如 SnapChat)
UICollectionView 布局像 SnapChat?