使用协议的跨类通信

时间:2012-01-03 23:17:20

标签: iphone objective-c

在我的应用程序中,我使用了3个类MasterViewController,DeviceViewController和BRButton。 BRButton类完成所有实际工作,并为其配备了蓝牙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(这里有两个不同的地方我称之为不同的类。第一个不适用于第二个。)

- (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(我希望在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];
}

如果您需要更多信息,请告诉我们。

2 个答案:

答案 0 :(得分:1)

使用断点并确保在其上调用tableTimer时“testCall”属性不为nil。

此外,你应该使testCall和委托弱,而不是分配,以防这些对象被dealloc'd。

答案 1 :(得分:0)

在MasterViewController.m中

你应该设置

BRButtonInstance.testCall = self;

其中BRButtonInstance是该类的实例。你确定你在某处做这件事吗?