2012-01-03 107 views
2

在我的應用程序中,我使用了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(這裏是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時不爲零。 – 2012-01-03 23:28:29

+0

就是這樣。我在需要時設置委託,但從未設置testCall。把一個簡單的b.testCall = self;現在它的所有工作。非常感謝。 – Merlin910 2012-01-03 23:52:29

+1

不適合作爲回答,所以你可以接受,如果你想要:P – 2012-01-03 23:56:02

回答

1

使用斷點並確保在您調用tableTimer時「testCall」屬性不爲零。

此外,你應該讓testCall和委託弱而不是分配的情況下,這些對象得到dealloc'd。

0

在MasterViewController.m您應該設置

BRButtonInstance.testCall = self; 

其中BRButtonInstance是類的一個實例。你確定你在某個地方做這個嗎?