草庐IT

UIButton 点击​​时的 IOS 回调

coder 2024-01-24 原文

我有一个按钮在我的应用程序的许多屏幕中使用。我想实现一个带有自定义图像的自定义按钮和按下按钮时的回调。

我用惯了 java 但我不知道如何在 iOS 中解决这个问题。我已经阅读了有关类别和子类化的内容,但我仍然不确定。

有没有人举个例子?或者什么是最好的解决方案?如果有任何帮助,我将不胜感激。

我做了什么(感谢@Aris):

.h文件

#import <UIKit/UIKit.h>

@interface UIButton (MyUIButton)

+ (UIButton *)customButtonWithTarget:(id)target;

@end

.m文件

#import "UIButton+MyUIButton.h"

@implementation UIButton (MyUIButton)

+ (UIButton *)customButtonWithTarget:(id)target{
    UIButton *button_ = [UIButton buttonWithType:UIButtonTypeSystem];
    [button_ setFrame:CGRectMake(0, 0, 120, 44)];
    [button_ setBackgroundImage:[UIImage imageNamed:@"button_image.png"] forState:UIControlStateNormal];

    [button_ addTarget:target
                action:@selector(event_button_click:)
      forControlEvents:UIControlEventTouchUpInside];

    return button_;
}

@end

在我的 ViewController 中:

#import "UIButton+MyUIButton.h"

- (void)viewDidLoad {
    [super viewDidLoad];
UIButton *myButton = [UIButton customButtonWithTarget:self];
    [self.view addSubview:myButton];

}

-(void)event_button_click
{
    // code here
}

我收到此错误:'-[ViewController event_button_click:]: unrecognized selector sent to instance 0x78e5df10'

最佳答案

子类化 UIButton 是错误的做法。您需要的是添加一个类别工厂方法来创建一个具有您需要的属性的按钮。 扩展 JNYJ 的回答:

+ (UIButton *)customButtonWithTarget:(id)target{
    UIButton *button_ = [UIButton buttonWithType:UIButtonTypeCustom];
    [button_ setFrame:CGRectMake(0, 0, 120, 44)];
    [button_ setBackgroundImage:[UIImage imageWithContentsOfFile:@"File path"] forState:UIControlStateNormal];

    [button_ addTarget:target 
                action:@selector(event_button_click:) 
      forControlEvents:UIControlEventTouchUpInside];

    return button;
}

您应该将此方法放在您可以使用 Xcode 创建的 UIButton 类别中,然后将文件导入到您需要创建按钮的所有位置。 导入类别后,您可以像这样调用方法:

[UIButton customButtonWithTarget:target];

您必须确保 target 实现名为 event_button_click: 的方法。

在典型情况下,Button 的目标应该是负责 View 的 viewController。如果您希望 Button 对所有 ViewController 执行相同的操作,那么 ViewController 应该是实现通用操作的 ViewController 的子类。

实现此目的的另一种方法是将目标设置为您知道将存在于整个应用程序生命周期中的对象。候选者可以是 Application Delegate 或其他一些单例。

响应 OP 的编辑:

您收到此错误的错误是因为选择器末尾有“:”。 这意味着该方法应采用 1 个参数。 响应按钮点击的典型方法具有以下签名:

- (void)didTapButton:(id)sender

sender 是生成事件的对象,在我们的例子中是按钮。

所以在你的情况下:

-(void)event_button_click:(id)sender
{
    UIButton * myButton = sender
    //custom code
}

关于UIButton 点击​​时的 IOS 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26990358/

有关UIButton 点击​​时的 IOS 回调的更多相关文章

  1. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  2. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  3. ruby-on-rails - 如何从过时的 TZInfo 标识符中获取 Rails TimeZone 名称? - 2

    已经有一个问题回答了如何将“America/Los_Angeles”转换为“PacificTime(US&Canada)”。但是我想将“美国/太平洋”和其他过时的时区转换为RailsTimeZone。我无法在图书馆中找到任何可以帮助我完成此任务的东西。 最佳答案 来自RailsActiveSupport::TimeZonedocs:TheversionofTZInfobundledwithActiveSupportonlyincludesthedefinitionsnecessarytosupportthezonesdefinedb

  4. ruby-on-rails - 将保存回调添加到单个 ActiveRecord 实例,可以吗? - 2

    是否可以为单个ActiveRecord实例添加回调?作为进一步的限制,这是继续使用库,所以我无法控制该类(除了对其进行猴子修补)。这或多或少是我想做的:defdo_something_creazymessage=Message.newmessage.on_save_call:do_even_more_crazy_stuffenddefdo_even_more_crazy_stuff(message)puts"Message#{message}hasbeensaved!Hallelujah!"end 最佳答案 你可以通过在创建对象后立

  5. ruby-on-rails - Ruby method_added 回调不触发包括模块 - 2

    我想写一点“Deprecate-It”库并经常使用“method_added”回调。但是现在我注意到在包含模块时不会触发此回调。是否有任何回调或变通方法,以便在某些内容包含到自身时通知类“Foobar”?用于演示的小Demo:#IncludingModulswon'ttriggermethod_addedcallbackmoduleInvisibleMethoddefinvisible"Youwon'tgetacallbackfromme"endendclassFoobardefself.method_added(m)puts"InstanceMethod:'#{m}'addedto'

  6. ruby - Sinatra:点击 URL 时运行 ruby​​ 代码 - 2

    我想在每次访问url/code时运行一个脚本(code.rb)。如何运行脚本?require'sinatra'get'/'do#runthescriptend 最佳答案 要么fork另一个进程:system('rubycode.rb')...或者简单地将脚本加载到当前上下文中:load'code.rb'#*not*require 关于ruby-Sinatra:点击URL时运行ruby​​代码,我们在StackOverflow上找到一个类似的问题: https:

  7. ruby-on-rails - 使用 before_save 回调或自定义验证器添加验证错误? - 2

    我有一个模型Listingbelongs_to:user。或者,Userhas_many:listings。每个列表都有一个对其进行分类的类别字段(狗、猫等)。User还有一个名为is_premium的bool字段。这是我验证类别的方式...validates_format_of:category,:with=>/(dogs|cats|birds|tigers|lions|rhinos)/,:message=>'isincorrect'假设我只想让高级用户能够添加老虎、狮子和犀牛。我该怎么做?最好在before_save方法中执行此操作吗?before_save:premium_che

  8. ruby - 比较 rspec 中的 float 时的奇怪行为 - 2

    以下测试中的第3个失败:specify{(0.6*2).shouldeql(1.2)}specify{(0.3*3).shouldeql(0.3*3)}specify{(0.3*3).shouldeql(0.9)}#thisonefails这是为什么呢?这是浮点问题还是ruby​​或rspec问题? 最佳答案 从rspec-2.1开始specify{(0.6*2).shouldbe_within(0.01).of(1.2)}在那之前:specify{(0.6*2).shouldbe_close(1.2,0.01)}

  9. ruby-on-rails - 如何在多个环境中处理 OmniAuth 回调? - 2

    我有一个应用程序专门使用Facebook作为身份验证提供程序,并正确设置了生产模式的回调。为了让它工作,您需要为您的Facebook应用程序提供一个站点URL和一个用于回调的站点域,在我的例子中是http://appname.heroku.com和appname。heroku.com分别。问题是我的Controller设置为只允许经过身份验证的session,所以我无法在开发模式下查看我的应用程序,因为Facebook应用程序的域显然没有设置为本地主机。如何在不更改Facebook设置的情况下解决这个问题? 最佳答案 创建另一个域l

  10. ruby - 难倒点击与 nokogiri 和 Mechanize 的链接 - 2

    也许我做错了,或者还有另一种更有效的方法。这是我的问题:我首先使用nokogiri打开一个html文档并使用其css遍历该文档,直到找到我需要单击的链接。现在我有了链接后,如何使用Mechanize来点击它?根据文档,Mechanize.new返回的对象是字符串或Mechanize::Page::Link对象。我不能使用字符串-因为可能有100个相同的链接-我只想Mechanize点击nokogiri遍历的链接。有什么想法吗? 最佳答案 找到所需的链接节点后,您可以手动创建Mechanize::Page::Link对象,然后单击它:

随机推荐