Iphone 未调用委托方法

Iphone 未调用委托方法,iphone,objective-c,xcode,delegates,Iphone,Objective C,Xcode,Delegates,作为一名初学者,我发现很难理解学员,因此我将尽力提问: 我想让Connection.m成为Controller.h的代表。 在我的控制器里。我有 @protocol HeliControllerDelegate <NSObject> @optional - (void) measurementUpdated:(NSNumber *) measurement; - (void) didDiscoverCharacteristic; // neh @end @interface H

作为一名初学者,我发现很难理解学员,因此我将尽力提问:

我想让Connection.m成为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中,我用

- (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> {
}
@接口连接:UIViewController{
}
因此,我可以使用Controller.h协议中的方法,但是即使程序执行了didDiscoveryCharacteristic调用,在Connection.m中的方法实现上也没有发生任何事情


非常感谢您在这方面提供的所有帮助。

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

@interface Controller { id (ControllerDelegate) controllerDelegate; } @property (nonatomic, assign) id (ControllerDelegate) controllerDelegate; @接口控制器 { id(ControllerDelegate)ControllerDelegate; } @属性(非原子,赋值)id(ControllerDelegate)ControllerDelegate; 对ControllerDelegate使用括号而不是() 并将其添加到下面的.m文件中

@synthesize controllerDelegate
@在Controller.m
self.delegate中合成controllerDelegate。调用
didiscovercharacteristic
时,委托很可能为零。您可以使用调试器或NSLog()检查这一点。确保将控制器对象的委托属性设置为正确的连接实例

  • ControllerDelegate之后的NSObject没有意义

  • 在Controoler类中声明委托属性


  • 你仍然错过了一些东西:

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

    它应适用于UITable的代理(例如,协议UITableViewDelegate)

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

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


    yourTable.delegate=anInstanceOfADelegateClass

    请提供更多的代码。self.delegate设置在哪里?在IB中还是代码中的某个地方?self.delegate设置为什么类型的对象?您是否实际实现了DidDiscoveryWithCharacteristic?怎么做?您将[self.delegate.discovercharacteristic]确切地称为什么时候。您是否在Connection.m中实现了
    didiscovercharacteristic
    ?2.您是否将
    连接的实例
    分配给控制器的委托属性?我仍然不明白。我需要一些代码的例子,可以告诉我尽可能容易,从我的代码派生出如何做到这一点。看看这篇文章:我尝试了,但没有理解它。事情变得有点混乱,因为控制器是CBPeripheral的委托,而连接应该是控制器的委托。我如何将它指向实例?代码片段将是greatHelicopter*helico=[[helicholder alloc]init]autorelease];代表=自我;(其中self我假设您实现委托方法和初始化对象的地方)它不喜欢具有相同名称的iVar和属性,因此我删除iVar并使用
    @synthetic controllerDelegate=\u controllerDelegate
    进行合成。但是我现在如何将连接设置为代理呢?如果(self.profilePhotoDelegate!=nil&&[self.delegate respondsToSelector:@selector(didDiscoverCharacteristic)]{[self.delegate didDiscoverCharacteristic];}并且在您的Connection.h文件中为Controller*Controller声明instant;和in.m file controller.delegate=self;在.m文件中实现DidDiscoveryCharacteristic方法-(void)DidDiscoveryCharacteristic{NSLog(@“DidDiscoveryCharacteristic”);} @synthesize controllerDelegate