2015-08-21 4 views
0

Я не могу вызвать метод, который написан в UIViewController (aViewController) из моего пользовательского представления bView. Я хочу назвать метод Функция на моей кнопке (btn) нажмите в UIView (bView). Но когда я нажимаю кнопку, я получаю следующую ошибку.Как вызвать метод из класса UIViewController в пользовательский класс UIView

непризнанным селектор отправляется, например ....

Вот мой код:

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]; 
} 

Как решить эту проблему?

+0

Вы пытались использовать 'strong' для' readonly' в '@property (nonatomic, readonly) UIButton * btn;'? – anhtu

+1

переключите две строки '' 'bView.bViewController = self;' '' 'и' '' [bView makeView]; '' ' –

+0

Спасибо, что ответили на anhtu и Fabio Berger.I мог решить эту проблему! – zmbdr

ответ

1

Вы устанавливаете цель на кнопку в методе [bView makeView];, но в то время bView: aViewController ничтожно, потому что вы устанавливаете его только на следующей строке. Так что попробуйте это:

-(void)viewDidLoad{ 
    bView = [[bView alloc]init]; 
    bView.bViewController = self; 
    [bView makeView]; 
    [self.view addSubView:bView]; 
} 
+0

Спасибо, что ответили! Я мог бы решить это по вашему совету! – zmbdr

+0

Итак, вы можете принять ответ. Еще одна вещь, я бы рекомендовал классы и соответствующие файлы, начиная с буквы верхнего регистра. – njuri

+0

Благодарим вас за советы. Я слышал, что если мы будем называть переменные, мы должны называть их, начиная с нижнего регистра. Так что я сделал это для классов и соответствующих файлов ... Мне все это нужно с этого момента, спасибо вам большое! – zmbdr

0

это, как вы делаете это, прежде всего, избавиться от «bView.bViewController = Я», он не работает таким образом, вы не должны делать это, когда-либо.

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

функция объявлена ​​в вашем UIViewController, не ваш UIView, так что вы должны вызвать к кнопке в вашем viewdidLoad через bView, а затем присвоить ему цель и действие. Я все равно не буду использовать этот метод, который вы используете, но это сделает это.

это магия:

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

И удалите эти строки из 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, учитывая то, что вы показываете, ju й называют это в 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, а затем научиться правильно подклассифицировать в будущем.

+0

Благодарим вас за ответ. Я не знал метода «[[bView btn] ....». Но где его написать? В представлении aViewController viewDidLoad? – zmbdr

+0

это не метод, это свойство переменной, которое вы создали в своем UIView – Loxx

+0

этой @property (неатомной, только для чтения) UIButton * btn; и нет причин делать это «только для чтения», просто используйте «nonatomic» – Loxx

Смежные вопросы