2013-04-24 4 views
1

У меня есть viewController Controller и вид view A. Также ViewA содержит кнопку. Как правило, мы вызываем функцию в том же классе, которая должна выполняться при нажатии кнопки. Но я хочу, чтобы метод в controller выполнялся при нажатии кнопки.Функция выбора, вызванная из другого класса

Ниже приведены два метода я выработанные:

//method 1 
//UIView A 
-(id)initWithSelector:(SEL)callbackInB withDelegate:(id)delagateB 
{ 
    self = [super init]; 
    if (self) 
    { 
     delegate = delegateB; 
     myCB = callbackInB; 
    } 
    return self; 
} 
//somewhere in UIView A 
[btn addTarget:delegate action:myCB forControlEvents:UIControlEventTouchUpInside]; 

Это работает отлично .Но вместо этого, если я в качестве второго метода, он показывает «выполнить селектор может вытечь как функция селектора неизвестна» ,

//method 2 
//somewhere in UIView A 
[btn addTarget:self action:@selector(btnPressed:) forControlEvents:UIControlEventTouchUpInside]; 


-(void)btnPressed:(id)sender 
{ 

    if([delegate respondsToSelector:myCB]) 
     [delegate performSelector:myCB]; 

} 
+0

удалить [БТН addTarget: делегировать действия: myCB forControlEvents: UIControlEventTouchUpInside] ; строка. [delegate performSelector: myCB] вызывается для действия myCB –

+0

, поэтому вы спрашиваете о двух разных вещах? 1) «выполнить селектор может протекать, когда функция выбора неизвестна», когда компилятор предупреждает о компиляторе, и 2) ваша программа вылетает при запуске? По крайней мере, дайте некоторую трассировку стека или некоторую информацию о сбое, если она действительно сработает. – newacct

+0

@newacct: программа не сбой сейчас, но почему предупреждение всплывает ?? – Subbu

ответ

1

Блоки являются ответом на эту проблему:

класса B

@property (copy, nonatomic) void (^myBlock)(void); 

-(id)initWithMyBlock:(void(^)(void))block 
{ 
    self = [super init]; 
    if (self) 
    { 
     self.myBlock = block; 
    } 
    return self; 
} 

[btn addTarget:delegate action:@selector(btnPressed) forControlEvents:UIControlEventTouchUpInside]; 

- (void)btnPressed { 
    if (_myBlock) { 
    _myBlock(); 
    } 
} 

Просто следите за сохранение циклов

+0

, но в чем проблема в моем коде? почему он падает? – Subbu