【问题标题】:Using sender to identify object that called method in ios使用发件人识别在ios中调用方法的对象
【发布时间】:2012-09-04 20:19:29
【问题描述】:

我是这方面的新手,所以在此先感谢您的帮助。

我只是在 iOS 中做一些小练习,我有 2 个不同的东西调用同一个例程。

这些消息调用中的每一个都通过发送者。其中一个是UIButton,它在touchUpInside 时调用,一个是UISegmentedControl,它在valueChanges 时调用。

我需要在同一个方法中稍微不同地处理初始部分,我知道我以某种方式使用了 sender。

我需要做的是询问发件人是UIButton还是发件人是UISegmentedControl

我试过了

if  ([sender isKindOfClass:UISegmentedControl]) { ... }

if ([sender isKindOfClass:UIButton]) { ... }

两者都抛出一个像这样的错误:

Unexpected interface name "UIButton": expected expression

所以这显然是错误的。

【问题讨论】:

  • 由于这是两种不同类型的控件,我强烈考虑让它们指向不同的函数,然后将 通用的代码移动到不同的例程中,您可以从这两个函数调用。我喜欢将代码隔离开来,这样既方便又易于理解......
  • 同意@lnafziger;一般来说,使用isKindOfClass: 来实现不同的行为既不常见也不鼓励。最好有不同的、显式的执行路径,并排除通用代码。指针比较(如下所述的 Hot Licks)更可口,但与简单地拥有一个单独的插座相比仍然有点迟钝。

标签: objective-c cocoa-touch ios5


【解决方案1】:
[sender isKindOfClass:UISegmentedControl]

应该是:

[sender isKindOfClass:[UISegmentedControl class]]

【讨论】:

  • @SimonTheDiver 如果此答案对您有所帮助,请务必通过单击此帖子旁边的“复选标记”将其标记为正确。
【解决方案2】:

请注意,您也可以简单地将sender 与链接到 UI 对象的 IBOutlet 变量进行比较。或者你可以给你的 UI 对象tags 和测试sender.tag

【讨论】:

  • +1,如果可能的话,我喜欢直接比较指针。它更清晰,技术上更快。
  • 使用标签的好处是,如果应该对多个发件人进行相同的处理,您可以对所有发件人使用相同的标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 2015-01-11
相关资源
最近更新 更多