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



>我有两个UILabelsUITableViewCell有两个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来了解两个标签中的哪一个被点击。但是您正在使用他们的标签来跟踪行。

我建议的解决方案是使用标签来区分两个标签。然后,您可以根据标签的框架计算行。

有关将单元格

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

做出以下假设:

  1. 您正在尝试使用 UIView.tag 唯一标识标签
  2. 您希望用户名和共享用户具有不同的行为

我建议以下内容,首先在您的 #imports 下方定义您的标签

#define kUsername 1
#define kSharedUser 2

然后将它们分配给您的视图

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

然后在你的准备中Segue

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

通过这种方式,您可以轻松简单地确定tap,请注意,如果您有超过1个用户名和共享用户标签,这可能会有不同的结果。然后,您将需要更多 #defines 或更改生成代码的方式。

可以将属性添加到 UILabel 以跟踪标签的类型。(我使用枚举,因为只有 2 种情况,但它可能是字符串等)

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

有了这个,如果你有一个偶数标签,它是用户名,奇数将是共享用户。除以 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)
}

最新更新