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

时间:2016-02-08 22:17:17

标签: ios swift segue uitapgesturerecognizer

我在UILabels中有两个UITapGestureRecognizers和两个UITableViewCell

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对应的所需信息} tag。

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

4 个答案:

答案 0 :(得分:4)

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

func GoToProfil (gestureRecognizer: UITapGestureRecognizer) {
}

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

但你似乎有两个相互矛盾的要求。您想知道哪两个标签被点击了,并且您想知道标签所在的行。

通常您会使用标签tag来了解两个标签中的哪一个被点按。但是您正在使用他们的标签来跟踪该行。

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

请参阅the following answer,了解将单元格子视图的框架转换为单元格indexPath的示例代码。

答案 1 :(得分:1)

做出以下假设:

  1. 您正尝试使用UIView.tag
  2. 唯一标识标签
  3. 您想要用户名和用户名的不同行为SharedUser
  4. 我建议如下,首先在#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
        }
    }
    

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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