iOS添加IBAction全局方法

时间:2014-06-09 08:09:34

标签: ios crash global-variables selector

我正在为某些视图添加工具栏,但我在GeneralFunctions中有方法,以便我可以通过视图来添加它。

+ (void)addCommentsBar:(UIView *)view
{
    CGPoint origin = CGPointMake(0.0, view.frame.size.height - 50);

    UIView *commentsView = [[UIView alloc] initWithFrame:CGRectMake(origin.x, origin.y, 320, 50)];
    commentsView.backgroundColor = [PitcheroColours pitcheroBlue];

    UILabel *commentsTitle = [[UILabel alloc] initWithFrame:CGRectMake(15, 2, 200, 50)];
    commentsTitle.text = @"1 Comment";
    commentsTitle.textColor = [UIColor whiteColor];

    UIButton *tapComments = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
    tapComments.backgroundColor = [UIColor clearColor];
    [tapComments addTarget:self action:@selector(tapComments:) forControlEvents:UIControlEventTouchUpInside];

    [commentsView addSubview:commentsTitle];
    [commentsView addSubview:tapComments];

    [view addSubview:commentsView];
}

按下时会调用tapComments:

- (IBAction)tapComments:(id)sender
{
    NSLog(@"Done");
}

它位于GeneralFunctions内部,但崩溃说:

Uncaught exception: +[GeneralFunctions tapComments:]: unrecognized selector sent to class 0x2d5b7c

我知道这是因为我正在远离视图调用选择器,但实现此目的的最佳做法是什么?!

2 个答案:

答案 0 :(得分:1)

您的addCommentsBar:方法是类方法而不是实例方法。在这里你要通过

添加目标
 [tapComments addTarget:self action:@selector(tapComments:) forControlEvents:UIControlEventTouchUpInside];

由于此方法是类方法,self它将被视为class而不是该类的实例。然后你将选择器传递给tapComments:,这是实例方法。

因此,您可以将target作为参数传递,也可以将tapComments:方法声明为类方法。

答案 1 :(得分:0)

如果您想从少数类(例如1或2)访问,最好使用委托。但是,如果您有更多的类可以访问您的全局源,那么使用单例模式进行全局化。 所以,在我看来,最好在你的情况下使用单身。