我的应用程序有多个视图以编程方式添加按钮,而不是在每个控制器中使用以下实例方法,我想将该方法放在一个公共类中,将其用作类方法。
+ (void) addLeftImageButton:(UIButton *)leftButton:(float)x:(float)y:(NSString *)name:(int) tag
{
leftButton = [UIButton buttonWithType:UIButtonTypeCustom];
[leftButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
[leftButton setTag: tag];
[leftButton setBackgroundImage:[UIImage imageNamed:name] forState:UIControlStateNormal];
leftButton.frame = CGRectMake(x, y, 345.0, 345.0);
[self.view addSubview:leftButton];
}
我的问题是如何将self.view
引用到调用视图。因为self.view
在公共类中是未知的。
答案 0 :(得分:6)
你不能,类方法没有self
的概念。您需要将视图作为参数传递。
+ (void)addLeftImageButton:(UIButton *)leftButton:(float)x:(float)y:(NSString *)name:(int) tag forView:(UIView *)view;
答案 1 :(得分:0)
我个人的建议是离开将子视图添加到控制器本身的步骤,使其成为类方法:
+ (UIButton *) leftButtonWithImageName:(NSString *)imageName x:(CGFloat)x y:(CGFloat)y tag:(int)tag
{
UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeCustom];
[leftButton setTag: tag];
[leftButton setBackgroundImage:[UIImage imageNamed:name] forState:UIControlStateNormal];
leftButton.frame = CGRectMake(x, y, 345.0, 345.0);
return leftButton;
}
在视图控制器中:
UIButton *leftButton = [MyClass leftButtonWithImageName:@"image.png" x:0 y:0 tag:10];
[leftButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:leftButton];
背后的几个原因:
buttonPressed:
方法,这不是一个安全的假设。 buttonPressed:
。leftButton...
方法的来电者可以更好地控制按钮。例如,他们可能希望将按钮添加为viewDidLoad
中的属性,以便可以查询其属性(如其框架),但实际上不会将其添加到屏幕上,直到动画完成为止。您也可以考虑将所有视图控制器作为超类的子类,但这是一个非常特定于实现的决策。
答案 2 :(得分:0)
如果这是所有控制器的常用方法,则应将其作为实例方法添加到所有其他控制器继承的基本控制器中。
此外,该方法还有一些奇怪的事情:
为什么在你做的第一件事就是覆盖它的值时,将leftButton
作为参数传递?
你的方法声明真的很奇怪。你看过警告了吗?我想你希望它看起来更像这样:
- (void)leftButtonWithImageName:(NSString *)name
x:(CGFloat)x
y:(CGFloat)y
tag:(int)tag
{
UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeCustom];
[leftButton addTarget:self
action:@selector(buttonPressed:)
forControlEvents:UIControlEventTouchUpInside];
[leftButton setTag:tag];
[leftButton setBackgroundImage:[UIImage imageNamed:name]
forState:UIControlStateNormal];
leftButton.frame = CGRectMake(x, y, 345.0, 345.0);
[self.view addSubview:leftButton];
}
答案 3 :(得分:0)
有几种方法可以实现这一点。但是一个普通的课程并不好。
最好的方法是将此函数作为UIViewController的类别。这是即时方法( - )但不是类方法(+) 您无需更改其他人。
#import <UIKit/UIKit.h>
@interface UIViewControl (labels)
-(void) add left...
@end
@implementation UIViewControl (labels)
-(void) add left...{}
@end
将上述代码放在文件“labelcontrol.h”和“label control.m”
中然后在你的任何viewcontroller.m中 添加:导入“labelcontrol.h”以使其正常工作