簡體   English   中英

如何在Swift中知道發件人的標識符

[英]How to know the sender's identifier in Swift

我有兩個UILabels兩個UITapGestureRecognizersUITableViewCell

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
}

我的問題是,我想知道已經按下了tag ,所以我想知道按下了哪個UILabel

您的GoToProfile:函數應正確編寫。 該參數不是“發送方”,而是手勢識別器。

func GoToProfil (gestureRecognizer: UITapGestureRecognizer) {
}

從那里,您可以使用手勢識別器的view屬性確定標簽。

但是您似乎有兩個相互矛盾的要求。 您想知道點擊了兩個標簽中的哪個標簽,並且想知道標簽在哪一行中。

通常,您將使用標簽的tag來知道點擊了兩個標簽中的哪個標簽。 但是您正在使用他們的標簽來跟蹤行。

我建議的解決方案是使用標簽區分兩個標簽。 然后,您可以根據標簽的框架計算行。

有關單元格的子視圖的框架轉換為單元格的indexPath示例代碼,請參見以下答案

進行以下假設:

  1. 您正在嘗試使用UIView.tag唯一標識標簽
  2. 您想要用戶名和SharedUser的不同行為

我建議以下內容,首先在#imports下定義您的標簽

#define kUsername 1
#define kSharedUser 2

然后將它們分配給您的視圖

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

然后在您的prepareSegue中

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或更改生成標記的方式。

您可以向UILabel添加屬性以跟蹤標簽的類型。 (我使用了一個枚舉,因為只有兩種情況,但是它可以是字符串,等等。)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM