如何在Swift中知道发件人的标识符

我有一个UITableViewCell有两个UITapGestureRecognizers

 cell.Username.tag = indexPath.row cell.SharedUser.tag = indexPath.row let tapGestureRecognizer2 = UITapGestureRecognizer(target:self, action:"GoToProfil:") let tapGestureRecognizer3 = UITapGestureRecognizer(target:self, action:"GoToProfil:") cell.Username.userInteractionEnabled = true cell.Username.addGestureRecognizer(tapGestureRecognizer2) cell.SharedUser.userInteractionEnabled = true cell.SharedUser.addGestureRecognizer(tapGestureRecognizer3) func GoToProfil (sender: AnyObject!) { self.performSegueWithIdentifier("GoToProfilSegue", sender: sender) } 

我使用Segue来推送另一个UIViewController ,并且我重写PrepareSegue函数来发送对应于Sender标签的所需信息。

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { let ProfilView = segue.destinationViewController as! Profil ProfilView.hidesBottomBarWhenPushed = true ProfilView.title = posts[sender.view!.tag].User?.objectForKey("Name") as? String ProfilView.User = posts[sender.view!.tag].User } 

我的问题是,我想知道哪个UILabel被按下,知道我已经使用tag

您的GoToProfile:函数应该正确写入。 该参数不是“发件人”,它是手势识别器。

 func GoToProfil (gestureRecognizer: UITapGestureRecognizer) { } 

从那里,您可以使用手势识别器的view属性来确定标签。

但是你似乎有两个相互冲突的要求。 你想知道两个标签中哪一个被点击了,你想知道标签在哪一行。

通常情况下,您可以使用标签的tag来了解两个标签中的哪一个被点击。 但是你正在使用他们的标签来追踪行。

我build议的解决scheme是使用标签来区分这两个标签。 然后你可以根据标签的框架来计算行。

有关将单元格的子视图的框架转换为单元格的indexPath示例代码,请参阅以下答案 。

做出以下假设:

  1. 您正试图使用UIView.tag唯一标识标签
  2. 您需要用户名和共享用户的不同行为

我build议如下,首先在#imports下面定义你的标签

 #define kUsername 1 #define kSharedUser 2 

然后将它们分配给您的意见

 cell.Username.tag = kUsername cell.SharedUser.tag = kSharedUser 

然后在你的准备阶段

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { int tag = [sender.view!.tag] if (tag == kUsername) { //Username logic } else if(tag == kSharedUser) { //Shared User Logic } } 

通过这种方式,您可以轻松简单地确定点按,注意,如果您有多个用户名和共享用户标签,则这可能会有不同的结果。 那么你将需要更多的#defines或者改变你如何生成你的标签。

你可以添加一个属性到UILabel来跟踪标签的types。 (我用了一个枚举,因为只有2个例子,但是可能是一个string等)

 enum LabelDest : String { case Username = "Username" case SharedUser = "SharedUser" } extension UILabel { struct Static { static var key = "labelDest" } var labelDest:LabelDest? { set { objc_setAssociatedObject( self, &Static.key, newValue?.rawValue, .OBJC_ASSOCIATION_COPY_NONATOMIC ) } get { guard let val = objc_getAssociatedObject( self, &Static.key ) as? String else { return nil } return LabelDest( rawValue:val ) } } } 

现在你可以这样做:

 let label = UILabel() label.labelDest = .Username 

后来:

 switch label.labelDest { case .Some(.Username): // handle user name break ... 

如果您想在标签上使用.tag字段,则可以使用其他技术来查找与标签关联的表格行:(再次使用类扩展名)

 extension UIView { var enclosingTableViewCell:UITableViewCell? { return superview?.enclosingTableViewCell } var enclosingTableView:UITableView? { return superview?.enclosingTableView } } extension UITableViewCell { var enclosingTableViewCell:UITableViewCell? { return self } } extension UITableView { var enclosingTableView:UITableView? { return self } } extension UIView { var tableRow:Int? { guard let cell = self.enclosingTableViewCell else { return nil } return self.enclosingTableView?.indexPathForCell( cell )?.row } } 

现在,从您的手势识别器动作:

 func goToProfil( sender:UIGestureRecognizer! ) { guard let tappedRow = sender.view?.tableRow else { return } // handle tap here... } 

您可以访问发件人数据,然后阅读发送给您的对象的标签,如示例代码中所示。

要唯一标识每一行和每个标签,可以使用如下所示:

  • cell.Username.tag = (indexPath.row*2)
  • cell.SharedUser.tag = (indexPath.row*2)+1

有了这个,如果你有一个偶数的标签,那么它的用户名就是SharedUser。 按照2楼的分界线划分,你可以将排放回去。

 @IBOutlet weak var test1: UILabel! @IBOutlet weak var test2: UILabel! override func viewWillAppear(animated: Bool) { test1.tag = 1 test2.tag = 2 test1.userInteractionEnabled = true test2.userInteractionEnabled = true self.test1.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleSingleTap:")) self.test2.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleSingleTap:")) } func handleSingleTap(sender: UITapGestureRecognizer) { print(sender.view?.tag) }