我正在为某些视图添加工具栏,但我在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
我知道这是因为我正在远离视图调用选择器,但实现此目的的最佳做法是什么?!
答案 0 :(得分:1)
您的addCommentsBar:
方法是类方法而不是实例方法。在这里你要通过
[tapComments addTarget:self action:@selector(tapComments:) forControlEvents:UIControlEventTouchUpInside];
由于此方法是类方法,self
它将被视为class
而不是该类的实例。然后你将选择器传递给tapComments:
,这是实例方法。
因此,您可以将target作为参数传递,也可以将tapComments:
方法声明为类方法。
答案 1 :(得分:0)
如果您想从少数类(例如1或2)访问,最好使用委托。但是,如果您有更多的类可以访问您的全局源,那么使用单例模式进行全局化。 所以,在我看来,最好在你的情况下使用单身。