我是ObjC的新手,我正在尝试在ViewController文件之外创建Button(遵循MVC范例)。 我做了什么:
·H
@interface MainMenu : UIButton
-(UIButton *)addButton;
@end
的.m
@implementation MainMenu
-(UIButton *)addButton {
UIButton* button = [[UIButton alloc] initWithFrame:CGRectMake(50.0, 50.0, 200.0, 75.0)];
[button setBackgroundColor:[UIColor colorWithRed:1.0
green:1.0
blue:0.0
alpha:1.0]];
[button setTitle:@"TITLE"
forState:UIControlStateNormal];
return button;
}
@end
在ViewController中,我想在屏幕上创建按钮,使其响应触摸事件。所以
.m
@implementation ViewController
-(void)viewDidLoad {
[super viewDidLoad];
MainMenu *menuButton = [[MainMenu alloc] init];
[menuButton addTarget:self
action:@selector(ButtonClick)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:menuButton];
}
-(void)ButtonClick {
NSLog(@"You clicked on button!!!");
}
@end
我可以通过在ViewController.m文件中实现all来使它工作,但希望我可以分开。上面的代码没有显示一个按钮
第二件事:我尝试将addTarget:action:forControlEvents:方法添加到MainMenu.m而不是ViewController.m,我无法使其正常工作,因为我需要将ViewController作为目标和方法从ViewController.m中传递给ButtonController.m选择器(我猜)
所以我很有兴趣如何根据MVC做到正确? 谢谢!
答案 0 :(得分:0)
你快到了。这是你做得对的:
1)将UIButton子类化为MainMenu类。 (我通常称之为MainMenuButton或更具体的东西)
2)在ViewController中设置,创建和配置MainMenu实例。
以下是你做错了:
1)没有实现自定义init方法
2)尝试从子类中的setFrame,这应该从ViewController
完成3)你需要修改self,这是子类的当前实例,而不是一个名为button的新变量
永远不会调用addButton方法,因为没有什么可以调用它。在自定义UIButton子类时,您需要在自定义init方法中执行所有这些操作。尝试使用以下代码替换addButton方法:
@implementation MainMenu
-(id)init {
self = [super init];
if(self) {
[self setBackgroundColor:[UIColor colorWithRed:1.0
green:1.0
blue:0.0
alpha:1.0]];
[self setTitle:@"TITLE"
forState:UIControlStateNormal];
}
return self;
}
@end
然后在ViewController中创建MainMenu子类的实例,设置框架,并像以前一样进行配置。调用[[MainMenu alloc] init]时将调用此init方法;并在将子类返回给ViewController之前配置子类。
@implementation ViewController
-(void)viewDidLoad {
[super viewDidLoad];
MainMenu *menuButton = [[MainMenu alloc] init];
[menuButton setFrame:CGRectMake(50.0, 50.0, 200.0, 75.0)];
[menuButton addTarget:self
action:@selector(ButtonClick)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:menuButton];
}
-(void)ButtonClick {
NSLog(@"You clicked on button!!!");
}
@end
答案 1 :(得分:0)
你正在做的方式有点不对,因为你继承UIButton然后你有实例方法addButton返回一个按钮,没有意义。您可以添加类级方法或仅添加子类,并添加另一个init方法来满足您的要求。
如果你想创建一个自定义按钮并希望添加目标动作也可以做这样的事情
@interface CustomButton : UIButton
- (instancetype)initWithTarget:(id)target andAction:(SEL)action;
@end
in .m file
@implementation CustomButton
- (instancetype)initWithTarget:(id)target andAction:(SEL)action {
self = [super initWithFrame::CGRectMake(50.0, 50.0, 200.0, 75.0)];
if (self) {
[self setBackgroundColor:[UIColor colorWithRed:1.0
green:1.0
blue:0.0
alpha:1.0]];
[self setTitle:@"TITLE"
forState:UIControlStateNormal];
[self addTarget:target
action:action
forControlEvents:UIControlEventTouchUpInside];
}
return self;
}
@end
你可以在任何地方使用它
[self.view addSubView:[CustomButton alloc] initWithTarget:self andAction:@selector(name)]];