ios - 使用一个与 UISwitch 相同的 UIButton

标签 ios objective-c uibutton uiswitch

我想将 UIButton 用作开关,第一次点击表示打开,第二次点击表示关闭 - 并继续。

我读了一个stackoverflow article并按照描述创建了一个新类 ToggleButton。通过堆栈溢出的建议,编码级别不会出现错误消息。然而,在运行程序时,按下切换按钮并因错误“[ViewController ToggleOn:]:无法识别的选择器发送到实例”而终止。

是否需要进一步的编码改进?

我的示例代码如下。

//ToggleButton.h:

@interface ToggleButton : UIButton
@property (nonatomic, getter=isOn) BOOL on;
-(void)toggle;
@end


//ToggleButton.m:

#import "ToggleButton.h"
@interface ToggleButton ()
@property (nonatomic, strong) UIImage *offStateImage;
@property (nonatomic, strong) UIImage *onStateImage;
-(void)touchedUpInside:(UIButton*) sender;
@end

@implementation ToggleButton
@synthesize on = _on;
@synthesize offStateImage = _offStateImage;
@synthesize onStateImage = _onStateImage;

-(void)awakeFromNib
{
[super awakeFromNib];

self.offStateImage = [self imageForState:UIControlStateNormal];
self.onStateImage = [self imageForState:UIControlStateHighlighted];

[self addTarget:self
         action:@selector(touchedUpInside:)
forControlEvents:UIControlEventTouchUpInside];
}


-(void)touchedUpInside:(UIButton*) sender
{ [self toggle]; }

-(void)toggle
{self.on = (!_on);}

-(void)setOn:(BOOL) on
{
_on = on;

if (on)
    [self setImage:self.onStateImage forState:(UIControlStateNormal)];
else
    [self setImage:self.offStateImage forState:(UIControlStateNormal)];
}

@end


//  ViewController.h`
#import <UIKit/UIKit.h>
#import "ToggleButton.h"

@interface ViewController : UIViewController
@property (nonatomic, retain) IBOutlet UIActivityIndicatorView *ai;
@property (nonatomic, retain) IBOutlet UISwitch *sw;
@property (nonatomic, retain) IBOutlet ToggleButton *tb;
@end


//ViewController.m

#import "ViewController.h"
@interface ViewController ()
@end

@implementation ViewController
@synthesize ai;
@synthesize sw;
@synthesize tb;

- (void)viewDidLoad
{
[super viewDidLoad];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}

//IBSwitch implementation

- (IBAction)SwitchChanged:(id)sender {
if(sw.on){    
[ai startAnimating];

}else{

[ai stopAnimating];}

}


//ToggleButton implementation

- (IBAction)ToggleButton:(id)sender {

if(tb.on){

    [ai startAnimating];

}else{

    [ai stopAnimating];}
}
@end

最佳答案

在界面构建器上添加一个按钮并将自定义类设置为ToggleButton(左起第三个选项卡)。

在ViewController.h中导入ToggleButton.h并添加这一行

@property (nonatomic, retain) IBOutlet ToggleButton *tb;

tb- (IBAction)ToggleButton:(id)sender 连接到界面构建器上的按钮。

在 ToggleButton.m 类中替换此方法

-(void)toggle
{self.on = (_on);}

-(void)toggle
{self.on = (!_on);}

现在它可以正常工作了。

关于ios - 使用一个与 UISwitch 相同的 UIButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23420221/

相关文章:

objective-c - UITableViewCell 未接收指定索引路径处的单元格对象

ios - 如何判断 CollectionViewCell 是否位于屏幕中央

ios - 在 UITableViewScrollPosition 之后找到 UITableViewCell 的 UIView frame

iphone - 重写 three20 TTDefaultStyleSheet 样式不起作用

iphone - UIButton 的图像与背景图像

iphone - tableView 上的绝对定位、 View 层次结构和重绘

ios - 具有相关项目的Xcode命令行构建

ios - 下载时播放音频而不下载文件两次?

Swift4 - UIButton 在 UIView 中使用 addTarget 时出现错误

iphone - 为什么这个 UIButton 在禁用时仍然触发事件处理程序