[英]How to know the sender's identifier in Swift
我有兩個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
標簽相對應的所需信息。
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
來知道點擊了兩個標簽中的哪個標簽。 但是您正在使用他們的標簽來跟蹤行。
我建議的解決方案是使用標簽區分兩個標簽。 然后,您可以根據標簽的框架計算行。
進行以下假設:
UIView.tag
唯一標識標簽 我建議以下內容,首先在#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.