0

作为初学者,我发现很难理解代表,所以我会尽可能地提出我的问题:

我希望 Connection.m 成为 Controller.h 的代表。在我的 Controller.h 我有

@protocol HeliControllerDelegate <NSObject>

@optional
- (void) measurementUpdated:(NSNumber *) measurement;
- (void) didDiscoverCharacteristic; // neh

@end

@interface HeliController : UIViewController <CBPeripheralDelegate>
@property (nonatomic, assign) id<HeliControllerDelegate> delegate;
@end

并在 Controller.m 中合成:

@synthesize delegate = _delegate;

在接口声明之前。在 Controller.m 我调用 didDiscoverCharacteristic

- (void) peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{

NSLog(@"Did discover characteristic for service %@", [service.peripheral UUID]);

for(CBCharacteristic *c in [service characteristics]){

    if([[c UUID] isEqual:HeliController.throttleCharacteristicUUID]){

        NSLog(@"Found throttle characteristic");

        self.throttleCharacteristic = c;

        [self.delegate didDiscoverCharacteristic];

    }
}
}

在委托文件 Connection.h 我开始

@interface Connection : UIViewController <CBCentralManagerDelegate, ControllerDelegate> {
}

这样我就可以使用Controller.h协议中的方法,但是即使程序执行了didDiscoverCharacteristic调用,Connection.m中的方法实现也没有任何反应。

对此的所有帮助都非常感谢。

4

4 回答 4

1

您是否在 Controller.h 文件中声明了委托?

@接口控制器
{
    id (ControllerDelegate) 控制器委托;
}
@property (nonatomic, assign) id (ControllerDelegate) controllerDelegate;

对 ControllerDelegate 使用 <> 括号而不是 () 并在 .m 文件中添加以下内容

@synthesize 控制器委托
于 2012-07-16T08:21:40.497 回答
1

你仍然想念一些东西:

你必须告诉你的“Controller”实例哪个实例是它的委托,这意味着你必须创建一个属性(称之为“delegate”或类似于“myDelegate”的东西)并将其设置为指向使用的类的实例该协议(在您的情况下为 Connection )。

它应该像 UITable 的代表一样工作(例如,使用协议 UITableViewDelegate)

你需要告诉你的 UITableView 谁是(哪个实例)可以“听到”调用 tableView:didSelectRowAtIndexPath: 和其他委托方法

设置指向它的表实例属性:

yourTable.delegate = anInstanceOfADelegateClass;

于 2012-07-16T08:25:19.407 回答
0

在 Controller.mself.delegate中调用时可能为零didDiscoverCharacteristic。您可以使用调试器或 NSLog() 进行检查。确保将@propertyController 对象的委托设置为正确的 Connection 实例。

于 2012-07-16T08:24:40.807 回答
0
  1. ControllerDelegate 之后的 NSObject 没有意义

  2. 在您的控制器类中声明一个委托属性

于 2012-07-16T08:24:57.933 回答