【问题标题】:Subclassing UIButton to handle clicks [closed]子类化 UIButton 来处理点击[关闭]
【发布时间】:2024-01-11 07:47:01
【问题描述】:

我正在尝试对 UIButton 进行子类化,以创建一个“更智能”的按钮,其中包含处理点击事件的逻辑。

实现这一目标的最佳方法是什么?我只需要覆盖 onClick 方法吗?或者我是否需要注册一个事件处理程序(如果需要,应该在哪里完成,因为有很多方法可以初始化 UIButton?)

【问题讨论】:

  • @dandan78 我希望我的按钮在单击时执行一些操作。我希望这个逻辑包含在我的按钮中。为了提供更多细节,我正在创建一个应用程序,其中每个按钮都播放声音 - 所以我希望我的每个按钮也封装一个 AVAudioPlayer 实例,单击按钮时应该播放。
  • “想想一个有 100 个按钮的应用程序,每个按钮都有自己的声音和行为。” - 你想要的最后一件事是 100 个 AVAudioPlayers。创建一个。在按下按钮时传递声音文件。
  • 我不明白为什么这被否决了这么多,我也不认为将按钮子类化以在触摸时播放声音会“违反” MVC 模式。输入反馈,无论是可见的还是可听的(例如 VoiceOver)都可以清楚地成为视图的一部分。
  • vikingosegundo, Josh Caswell, Mehul, Janak Nirmal, David Rönnqvist 这是个好问题!!提问者要求解决问题的“最佳”方法。回复可能包括对 Apple 文档的引用或其他有用的讨论。

标签: objective-c ios cocoa-touch uibutton


【解决方案1】:

我认为这个问题有比你提出的更好的解决方案,但要直接回答你的问题:UIButton 的子类观察触摸事件的方式与其他人观察触摸事件的方式相同。

// In your UIButton subclass

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super buttonWithType:UIButtonTypeCustom];
    if (self) {
        [self addTarget:self action:@selector(didTouchButton) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}

- (void)didTouchButton {
    // do whatever you need to do here
}

重要提示:您不能使用[UIButton buttonWithType:] 创建按钮,您必须使用initinitWithFrame:。即使 UIButton 有便捷的初始化器,initWithFrame: 仍然是指定的初始化器。

【讨论】: