【问题标题】:Passing Arguments with Tap Gesture Recognizer使用点击手势识别器传递参数
【发布时间】:2012-12-15 13:52:08
【问题描述】:

以前曾以某种形式提出过这个问题,但我找不到适合我情况的答案。

简而言之:我正在为我的应用程序构建一个图库模块。它由几个部分组成,每个部分中有许多缩略图。基本原则是图像查看器模块根据用户所在的部分以及他或她点击的缩略图以模态方式启动和呈现。看起来很简单;我所需要的只是在图像查看器初始化时传递两个 int 变量(一个用于部分,一个用于图像),一切都是 hunky-dory。

问题是 UITapGestureRecognizer 不能直接调用方法。它使用选择器,我无法通过它传递参数,更不用说两个了。我正在寻找的是这样的:

[thumbnail004 setUserInteractionEnabled:YES];
UITapGestureRecognizer *tap004 = [[UITapGestureRecognizer alloc] 
                       initWithTarget:self
                       action:@selector(imageTappedWithSectionNumber:6
                                                      andImageNumber:4)];
[thumbnail004 addGestureRecognizer:tap004];

在使用 UITapGestureRecognizer 时,有没有办法直接带参数调用方法?

如果没有,解决此问题的一个明显方法是为每个图像点击创建单独的方法,例如:

- (void) image1_1Tapped { 
  // View initialization by passing 1 and 1
  }
- (void) image1_2Tapped { 
  // View initialization by passing 1 and 2
  }
And so on...

这是可能的,因为图像库不是动态的,但是,这将是世界上最丑陋的代码,我想不惜一切代价避免它。

一定有办法用干净优雅的代码做到这一点......!

进一步参考: 1.我不使用IB;我以编程方式做所有事情。 2.传递一个参数是不够的;我真的需要通过两个。

【问题讨论】:

    标签: iphone ios argument-passing uitapgesturerecognizer


    【解决方案1】:

    使用associated objectpass argument 以及tap gesture instance.

    参考objective-c-associated-objects链接。

    【讨论】:

    • 我会调查的!谢谢!
    • +1 因为我不知道。这在处理UIAlertView 时也很方便。
    • 但是这种方法有性能权衡,如果将其视为解决方案,也会考虑线程管理
    • 你有什么建议?非常欢迎您编辑我的答案。
    【解决方案2】:

    手势识别器只会将一个参数传递给动作选择器:它自己。我假设您正在尝试区分对主视图的各种图像子视图的点击?在这种情况下,最好的办法是调用 -locationInView:,传递超级视图,然后在该视图上调用 -hitTest:withEvent: 并生成 CGPoint。

    【讨论】:

    • 这正是我想要做的。我会考虑你的建议;这似乎是一个可行的解决方法,尽管有点乏味。
    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    相关资源
    最近更新 更多