我想使用UIButton作为开关,第一次点击作为打开,第二次点击作为关闭-以及更高的开关。
我读取了一个stackoverflow article并按照描述创建了一个新类ToggleButton。通过使用来自堆栈溢出的kind建议,在编码级别上没有出现错误消息。但是,在运行程序时,按下了选择器,并被错误"ViewController ToggleOn::unrecognized toggleButton sent to instance“终止。
还需要进一步的编码改进吗?
我的示例代码如下所示。
//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发布于 2014-05-02 13:12:28
在界面构建器上添加一个按钮,并将自定义类设置为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);}现在它会工作得很好。
发布于 2014-05-02 12:12:57
如果您使用的是接口构建器:将定制类设置为ToggleButton,就像保罗所说的那样。
如果在代码中创建按钮,只需在视图控制器中创建一个新的ToggleButton类实例即可。
https://stackoverflow.com/questions/23420221
复制相似问题