В моем приложении я использую 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];
}
Если вам нужно больше информации, дайте мне знать.
Не могли бы вы показать, где вы устанавливаете делегат и «testCall»? Используйте точку останова и убедитесь, что она не равна нулю, когда вы вызываете на нее tableTimer. –
Вот и все. Я установил делегат, когда это было необходимо, но никогда не устанавливал testCall. Поместите простой b.testCall = self; теперь все работает. Огромное спасибо. – Merlin910
Сообщение, которое вы можете принять, если хотите: P –