2012-01-03 2 views
2

В моем приложении я использую 3 класса MasterViewController, DeviceViewController и BRButton. Класс BRButton выполняет всю реальную работу и имеет обратные вызовы делегатов аппаратного обеспечения в устройствах bluetooth 4.0. Я пытаюсь получить методы для запуска в других классах, когда что-то происходит в BRButton. Это работает в DeviceViewController, но не в MasterViewController, я все еще довольно зеленый с программированием IOS, любая помощь приветствуется. Вот несколько фрагментов кода.
Еще одна вещь, которую я должен упомянуть, это не ошибка, она просто не вызывает метод.Обмен сообщениями с использованием протоколов

BRButton.h

@protocol RefreshScreen 
-(void) tableTimer:(NSTimer *)timer; 
@end 

@protocol BRButtonDelegate 
@optional 
-(void) bounceBack; 
-(void) tableTimer:(NSTimer *)timer; 
@required 
-(void) buttonReady; 
@end 

@interface BRButton : NSObject <CBCentralManagerDelegate, CBPeripheralDelegate> { 
    NSTimer *myTimer; 
} 

@property (nonatomic,assign) id <BRButtonDelegate> delegate; 
@property (nonatomic,assign) id <RefreshScreen> testCall; 

BRButton.m (здесь 2 разные места, которые я называю что-то в другом классе. Сначала один не работает второй делает.)

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { 
    ...does some work then... 
     [[self testCall] tableTimer:nil]; //tableTimer is nil here because no NStimer is used to trigger from this delegate method. 
     printf("New UUID, adding\r\n"); 

    printf("didDiscoverPeripheral\r\n"); 
} 


- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error { 
    printf("Disconnecting \r\n"); 
    [[self delegate] bounceBack]; 
} 

MasterViewController .h

@interface MasterViewController : UIViewController < UITableViewDelegate, UITableViewDataSource, RefreshScreen> { 
    BRButton *b; 
} 

MasterViewController.m (Я ожидаю, что это будет вызвано после моей точки останова o п didDiscoverPeripheral, но он никогда не.)

-(void) tableTimer:(NSTimer *)timer { 
    if(b.peripherals.count > 0) 
    { 
     [self.deviceTableView reloadData]; 
    } 
} 

DeviceViewController.h

@interface DeviceViewController : UIViewController <BRButtonDelegate> { 
} 
@property (strong, nonatomic) BRButton *bb; 

DeviceViewController.m

- (void) bounceBack { 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

Если вам нужно больше информации, дайте мне знать.

+1

Не могли бы вы показать, где вы устанавливаете делегат и «testCall»? Используйте точку останова и убедитесь, что она не равна нулю, когда вы вызываете на нее tableTimer. –

+0

Вот и все. Я установил делегат, когда это было необходимо, но никогда не устанавливал testCall. Поместите простой b.testCall = self; теперь все работает. Огромное спасибо. – Merlin910

+1

Сообщение, которое вы можете принять, если хотите: P –

ответ

1

Используйте точку останова и убедитесь, что свойство "testCall" не равно нулю, когда вы вызываете на него tableTimer.

Кроме того, вы должны сделать testCall и делегировать слабые, а не назначать, если эти объекты получат dealloc'd.

0

в MasterViewController.m вы должны быть настройки

BRButtonInstance.testCall = self; 

где BRButtonInstance является экземпляром класса. Вы уверены, что делаете это где-то?

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