我想将 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/