如何在Swift中知道发件人的标识符
我有一个UITableViewCell
有两个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
来了解两个标签中的哪一个被点击。 但是你正在使用他们的标签来追踪行。
我build议的解决scheme是使用标签来区分这两个标签。 然后你可以根据标签的框架来计算行。
有关将单元格的子视图的框架转换为单元格的indexPath
示例代码,请参阅以下答案 。
做出以下假设:
- 您正试图使用
UIView.tag
唯一标识标签 - 您需要用户名和共享用户的不同行为
我build议如下,首先在#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 } }
通过这种方式,您可以轻松简单地确定点按,注意,如果您有多个用户名和共享用户标签,则这可能会有不同的结果。 那么你将需要更多的#defines或者改变你如何生成你的标签。
你可以添加一个属性到UILabel来跟踪标签的types。 (我用了一个枚举,因为只有2个例子,但是可能是一个string等)
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) }