【问题标题】:Calling a Method from one class and used in another class从一个类调用方法并在另一个类中使用
【发布时间】:2015-09-15 18:08:01
【问题描述】:

我在 ViewController 中有一个方法来绘制一个按钮。在 ViewController2 中,我想调用该方法并绘制按钮。

在 ViewController.h 中

@interface ViewController : UIViewController

-(void)method;
@end

ViewController.m

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

-(void)method{
    UIButton*Touch1= [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [Touch1 addTarget:self action:@selector(TouchButton1:) forControlEvents:UIControlEventTouchUpInside];
    [Touch1 setFrame:CGRectMake(50,50, 100, 100)];
    Touch1.translatesAutoresizingMaskIntoConstraints = YES;
    [Touch1 setBackgroundImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal];
    [Touch1 setExclusiveTouch:YES];
    [self.view addSubview:Touch1];

    NSLog(@"hi ");
}

-(void)TouchButton1:(UIButton*)sender{

    NSLog(@"hi again");

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

然后我尝试从 ViewController2 调用

- (void)viewDidLoad {
    [super viewDidLoad];
    ViewController * ViewCon = [[ViewController alloc]init];
    [ViewCon method];
}

NSLog 显示正确的文本,但没有创建按钮。 我的问题是什么?

谢谢

【问题讨论】:

  • 请添加完整的详细信息,以便我可以帮助您

标签: ios objective-c class uibutton


【解决方案1】:

我认为这个问题是由方法“方法”上的“自我”范围引起的。您的按钮已添加到 de firstView 而不是 secondView 中。要做你想做的事,你必须通过你喜欢的范围来添加按钮。就像@trojanfoe 给出的示例一样。

-(void)method:(UIView *)_view {
    UIButton*Touch1= [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [Touch1 addTarget:self action:@selector(TouchButton1:) forControlEvents:UIControlEventTouchUpInside];
    [Touch1 setFrame:CGRectMake(50,50, 100, 100)];
    Touch1.translatesAutoresizingMaskIntoConstraints = YES;
    [Touch1 setBackgroundImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal];
    [Touch1 setExclusiveTouch:YES];
    [_view addSubview:Touch1];

    NSLog(@"hi ");
}

在您的第二个视图中,您可以调用:

 ViewController * ViewCon = [[ViewController alloc]init];
[ViewCon method:self.view];

我认为这就是问题所在,希望对你有所帮助

【讨论】:

  • 这是一种糟糕的模式,因为它效率低且不方便。
  • 创建一个具有你的功能的类,更可重用。如果代码的另一部分使用相同的逻辑来实现该按钮,则可以使用“utils”类而不使用可复制代码。但是,如果您的问题是一个特定问题,只会在您的整个代码中使用一次,那么做一个分离的类是解决简单问题的一种更复杂的方法。但是像@trojanfoe 在他们答案的最后部分所说的那样做一个类别是一个聪明的解决方案。
【解决方案2】:

使用可以从两个视图控制器调用的类方法创建一个单独的类(例如称为Utils):

@implementation Utils

+(void)methodForView:(UIView *)view
{
    UIButton*Touch1= [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [Touch1 addTarget:self action:@selector(TouchButton1:) forControlEvents:UIControlEventTouchUpInside];
    [Touch1 setFrame:CGRectMake(50,50, 100, 100)];
    Touch1.translatesAutoresizingMaskIntoConstraints = YES;
    [Touch1 setBackgroundImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal];
    [Touch1 setExclusiveTouch:YES];
    [view addSubview:Touch1];
}

@end

然后这样称呼它:

- (void)viewDidLoad {
    [super viewDidLoad];
    [Utils methodForView:self.view];
}

或者更好的是,在UIViewController-子类中实现该方法,然后从这个基类派生所有其他视图控制器。

【讨论】:

    猜你喜欢
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多