Objective C如何在类方法中引用视图

时间:2013-11-28 16:22:10

标签: ios objective-c uiview

我的应用程序有多个视图以编程方式添加按钮,而不是在每个控制器中使用以下实例方法,我想将该方法放在一个公共类中,将其用作类方法。

+ (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在公共类中是未知的。

4 个答案:

答案 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)

如果这是所有控制器的常用方法,则应将其作为实例方法添加到所有其他控制器继承的基本控制器中。

此外,该方法还有一些奇怪的事情:

  1. 为什么在你做的第一件事就是覆盖它的值时,将leftButton作为参数传递?

  2. 你的方法声明真的很奇怪。你看过警告了吗?我想你希望它看起来更像这样:

    - (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”以使其正常工作