Swift 将按钮操作添加到 TableView 单元格
Posted
技术标签:
【中文标题】Swift 将按钮操作添加到 TableView 单元格【英文标题】:Swift Adding Button Action to TableView Cell 【发布时间】:2015-05-01 13:57:38 【问题描述】:我正在尝试在我的自定义 tableview 单元格中创建一个按钮,该按钮具有创建 Parse 类的操作(如果尚未创建)并将按钮单击的行的标签文本应用为值对于“following”列,并将“follower”列值设置为当前登录用户的用户名。目前,我在 addUser IBAction 中的 let usernameLabel
处出现错误,表明我的类没有名为 objectAtIndex
的成员。实现我的目标的最佳方法是什么?
我在 SearchUsersRegistrationTableViewCell.swift 中创建了网点
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
这是我的表格功能以及我尝试应用到我的addUserButton
的操作:
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 = self.objectAtIndex(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】:我假设 usernameLabel 与 UIButton 发送者在同一个 contentView 上。如果是这种情况,您可以将标签添加到 usernameLabel 并执行此操作
let usernameLabel = sender.superview.viewWithTag(/*Put tag of label here*/)
我在手机上,所以我不知道 viewWithTag 是否是该方法的正确名称,但它是类似的。
希望这会有所帮助。
【讨论】:
嘿@Tobias,感谢您的回答。对不起,我对你的/*Put tag of label here*/
感到困惑,你的意思是按钮插座,它有一个标签方法?
因此您可以将 Int 值与任何视图 someView.tag = 10
相关联。然后您可以稍后找到带有标签aSuperview.viewWithTag(10)
的视图。您还可以在情节提要或 xib 中设置此值,方法是选择视图并转到 Attributes Inspect (option+cmd+4),然后转到 View 部分,在 Mode 下拉菜单下应该有一个 Tag 文本字段。所以我会在你试图获取和使用的 usernameLabel 上设置标签。
嘿@Tobias,现在对我来说更有意义了。所以我在情节提要中选择了我的标签并将该标签的值更改为 1。在我的代码中,我现在使用 let usernameLabel = sender.superview?.viewWithTag(1)
之后,我想获取该标签文本值并将其设置为我的以下 ["following"] = usernameLabel`目的。当我尝试使用usernameLabel.text
时,它似乎是不可能的,当我只运行following["following"] = usernameLabel
时,我得到一个错误,`NSInvalidArgumentException,原因:'PFObject 值可能没有类:UILabel'。我正在尝试将标签的文本设置为值。
很高兴知道您正在取得进展。您现在可以访问 usernameLabel UILabel 对象。现在您正尝试通过 followers["following"] = usernameLabel.text
将 usernameLabel.text 字符串值与您的 Parse 对象相关联。您收到的错误意味着 Followers 类的 Parse 对象不接受 String 值。您需要确定它期望的类型并分配该类型的值。它是否期望 PFObject 类用户?它需要一个字符串数组吗?回答完这个问题后,您需要将用户名字符串转换为该类型。
是的,这需要作为 PFObject,除非您熟悉 Parse,否则您可能很难回答,但是当我设置 following["following"] = usernameLabel as PFObject
时,我收到错误 'UIView?' is not convertible to 'PFObject'
和 following["following"] = usernameLabel.text as PFObject
给我Cannot assign a value of type 'PFObject' to a value of type 'AnyObject'
。【参考方案2】:
您收到错误是因为您使用的是self
而不是tableView
let usernameLabel = self.objectAtIndex(sender.tag) as! String
let usernameLabel = tableView.objectAtIndex(sender.tag) as! String
但是,这仍然会给您一个错误,因为 UITableViewCell
不能转换为 String
。
这是一个更好的选择:
if let surtvc = tableView.objectAtIndex(sender.tag) as? SearchUsersRegistrationTableViewCell
// surtvc.usernameLabel...
// the rest of your code goes here
【讨论】:
嘿@Allen Chau,感谢您的回答。我收到代码的objectAtIndex
部分错误。也许这不是这个陈述的正确方法。错误:SearchUsersRegistrationViewController does not have a member names 'objectAtIndex'
@cphill 该错误是因为 ViewController 没有该方法。它有loadParseData
和addUser:
等方法
@cphill 哦,对不起,我假设您使用的是基于方法的 UITableViewController。不是这样吗?
嘿@AllanChau 我正在使用带有tableview 的UIViewController。我计划将搜索添加到视图控制器,这就是我不想使用 UITableViewController 的原因。
@cphill 这可以很容易地添加使用 UISearchController 或 UITableViewController 与 Textfield 作为搜索栏。无论如何,我已经更新了上面的答案,应该可以回答您的问题。 :]以上是关于Swift 将按钮操作添加到 TableView 单元格的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 的 swift 中将浮动操作按钮放在 tableView 中?
Swift-使用委托将数据附加到 CollectionView 中的 TableView
如何以编程方式将不同单元格的不同图像添加到 tableView (Swift)