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

Ios 如何在Swift中知道发件人的标识符,ios,swift,segue,uitapgesturerecognizer,Ios,Swift,Segue,Uitapgesturerecognizer,我在一个UITableViewCell中有两个UILabel和两个UIAPTgestureRecognitors 我正在使用Segue推送另一个UIViewController,我正在重写PrepareSegue函数以发送与Sender标记对应的所需信息 我的问题是,我想知道按下了哪个UILabel,因为我已经在使用tag。您的GoToProfile:函数应该正确编写。参数不是发送者,而是手势识别器 func GoToProfil (gestureRecognizer: UITapGesture

我在一个UITableViewCell中有两个UILabel和两个UIAPTgestureRecognitors

我正在使用Segue推送另一个UIViewController,我正在重写PrepareSegue函数以发送与Sender标记对应的所需信息

我的问题是,我想知道按下了哪个UILabel,因为我已经在使用tag。

您的GoToProfile:函数应该正确编写。参数不是发送者,而是手势识别器

func GoToProfil (gestureRecognizer: UITapGestureRecognizer) {
}
从那里,您可以使用手势识别器的view属性来确定标签

func GoToProfil (gestureRecognizer: UITapGestureRecognizer) {
}
但您似乎有两个相互冲突的要求。您想知道两个标签中的哪一个被点击,以及标签所在的行

通常,您会使用标签的标签来知道两个标签中的哪一个被点击。但是您正在使用它们的标记来跟踪行

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


有关将单元格子视图的帧转换为单元格的indexPath的示例代码,请参阅。

您可以访问发件人数据,并读取发送给您的对象的标记,如本示例代码所示

要唯一标识每一行和每个标签,可以使用以下内容:

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)
}

作出以下假设:

您正在尝试使用UIView.tag唯一标识标签 您希望用户名和SharedUser具有不同的行为 我建议您首先在导入下面定义标记

#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
    }
}

通过这种方式,您可以轻松简单地确定点击,请注意,如果您有超过1个用户名和SharedUser标签,则可能会产生不同的结果。然后,您将需要更多定义或更改生成标记的方式。

您可以向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...
}

UITextLabel是什么?没有这样的事情。对不起,我编辑了这篇文章,我的意思是UILabel你可以在点击第二个UILabel时添加一个不同的函数来调用。然后,该函数将调用不同的seg标识符,例如performSeueWithIdentifierGotoProfilSeg2。然后在prepareForSegue方法中,您只需使用if语句来处理要执行的segue,即if segue.identifier==。。。{…}让另一个序列显示相同的视图控制器是没有用的-函数和变量名以小写字母开头,只有类名以大写字母开头是标准的命名约定。请说明如何使用View属性确定标签,这就是我所缺少的,我不知道Swift,但类似于let label=gesturecognizer.view as UILabel。我相信这不是100%正确,但这应该会有所帮助。这取决于你标记了什么@YasserB。如果您标记了内部子视图,并且容器通过了,那么它将无法工作,因为您检查的视图不是您标记的视图,并且使用viewTags这种方式非常脆弱。我认为@YasserB希望能够识别是用户名还是被点击的SharedUser标签。仅仅拥有标签并不能告诉他们这两个标签是哪一个,而且标签已经被用于其他用途,所以不能使用。@YasserB。我在答案的末尾添加了一个链接,显示了这样的代码。发送者不是标签,而是手势识别器。糟糕的是,我从按钮中提取了一个代码,忘记了点击。。。代码现在是正确的。这更好,但是OP正在为indexPath.row使用标签的标记。您也可以在IB中使用附加运行时属性面板设置此属性,我想这就是它的名称
func goToProfil( sender:UIGestureRecognizer! )
{
    guard let tappedRow = sender.view?.tableRow else { return }
    // handle tap here...
}