如何从UIViewController类调用方法到Custom UIView类

时间:2015-08-21 06:20:59

标签: ios objective-c c uiview uibutton

我无法从自定义视图 bView 调用UIViewController(aViewController)中编写的方法。 我想在我的按钮(btn)上调用方法 function ,然后单击UIView(bView)。但是当我点击按钮时,我收到以下错误。

  

无法识别的选择器发送到实例....

这是我的代码:

aViewController.h

#import "bView.h"
#import "cViewController.h"

-(void)function;

aViewController.m

-(void)viewDidLoad{

   bView = [[bView alloc]init];
   [bView makeView];
   bView.bViewController = self;
   [self.view addSubView:bView];

}


-(void)function{

   cViewController *nextViewController = [[cViewController alloc] initWithNibName: nil bundle: nil];
    [self.navigationController pushViewController: nextViewController animated: YES];

}

bView.h

#import "bViewController.h"

@interface bView : UIView{
   UIButton btn;
   bView *BView;
}

-(void)makeView;
-(void)function;

@property (nonatomic,readonly) UIButton *btn;
@property (assign) UIViewController* aViewController;

bView.m

#import "bView.h"
#import "aViewController.h"

@impementation bView
@synthesize btn;
@synthesize aViewController;

-(void)makeView{

    btn= [UIButton buttonWithType:UIButtonTypeRoundedRect];
    UIImage *btnimg = [UIImage imageNamed:@"btn.png"];
    [btn setBackgroundImage:btnimg forState:UIControlStateNormal];
    btn.frame = CGRectMake(65, 380, 60, 60);
    [self addSubview:btn];
    btn.userInteractionEnabled = YES;
    [btn addTarget:aViewController action:@selector(function) forControlEvents:UIControlEventTouchUpInside];
}

如何解决?

2 个答案:

答案 0 :(得分:1)

您正在使用[bView makeView];方法设置目标按钮,但当时bView的{​​{1}}为零,因为您只在下一行设置它。所以试试这个:

aViewController

答案 1 :(得分:0)

这就是你如何做到的,首先,摆脱" bView.bViewController = self",它不会那样工作,你不应该这样做,永远

-(void)viewDidLoad {
   bView = [[bView alloc]init];
   [bView makeView];
   [self.view addSubView:bView];
   [[bView btn] addTarget:self action:@selector(function) forControlEvents:UIControlEventTouchUpInside];
}

函数在您的UIViewController中声明,而不是您的UIView,因此您必须通过bView调用viewdidLoad中的按钮,然后为其分配目标和操作。我仍然不会使用你正在使用的这种方法,但是这样做会。

这就是魔术:

[[bView btn] addTarget:self action:@selector(function) forControlEvents:UIControlEventTouchUpInside];

AND,从UIView中删除这些行:

@property (assign) UIViewController* aViewController;
-(void)function;
[btn addTarget:aViewController action:@selector(function) forControlEvents:UIControlEventTouchUpInside];

如果您的意图是UIViewController具有函数"(void)函数"那么你应该删除它们。我认为这就是你的意思。我假设你的"功能"应该在你的UIViewController中调用

出于此目的,这个:

 [[bView btn] addTarget:self action:@selector(function) forControlEvents:UIControlEventTouchUpInside];

与此相同:

   [bView.btn addTarget:self action:@selector(function) forControlEvents:UIControlEventTouchUpInside];

bView.btn = @property (nonatomic,readonly) UIButton *btn;

事实上,根据你所展示的内容,你不需要在任何UIView中调用此按钮,只需在viewDidLoad中调用它,如下所示:

-(void)viewDidLoad 
{
    [super viewDidLoad];

    UIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    UIImage *btnimg = [UIImage imageNamed:@"btn.png"];
    [btn setBackgroundImage:btnimg forState:UIControlStateNormal];
    btn.frame = CGRectMake(65, 380, 60, 60);
    btn.userInteractionEnabled = YES;
    [self.view addSubview:btn];
    [btn addTarget:self action:@selector(function) forControlEvents:UIControlEventTouchUpInside];
}

我告诉你这是因为你没有通过调用超级指定的初始化程序来正确设置UIView所以现在最好的选择是将按钮放在您的viewDidLoad并继续前进,这是解决方案,直到您了解如何初始化UIView并正确设置它。你已经设置并尝试子类的UIView有很多错误,你可以更轻松地在viewDidLoad中创建按钮,然后学习如何在将来