【问题标题】:Obj-C: I'm trying to understang delegates, but I'm messing something [closed]Obj-C:我试图理解代表,但我错过了一些东西[关闭]
【发布时间】:2012-10-11 04:22:05
【问题描述】:

我看到了 Flower an MyGarden 的示例,但是当我尝试制作类似的东西时,它不起作用。我的代码:

ClassA.h:

#import <Foundation/Foundation.h>

@protocol CommDelegate <NSObject>
@required
-(void)funcB;
@end

@interface ClassA : NSObject
{
    id <CommDelegate> delegate;
}
@property (retain) id delegate;
-(void)funcB;
@end

ClassA.m

#import "ClassA.h"

@implementation ClassA
-(void) start
{
    [[self delegate] funcB];
}
@end

ClassB.h

#import <Foundation/Foundation.h>
#import "ClassA.h"

@interface ClassB : NSObject <CommDelegate>
@end

ClassB.m

#import "ClassB.h"

@implementation ClassB
-(void)funcB
{
    NSLog(@"HELLO!");
}
@end

我主要做的是:

ClassA* classa = [[ClassA alloc] init];
[classa start];

谁能帮助我,告诉我我做错了什么?

【问题讨论】:

  • “不起作用”是什么意思?不编译?运行时崩溃?运行成功但行为异常?清晰准确!
  • 同意@AdamRosenfield。正如所提出的,这不是一个问题。你展示你的代码;那挺好的。但是,您必须说出您的预期以及运行该代码时实际发生的情况。
  • 虽然说明什么不工作很重要,但很清楚代码出了什么问题......从未分配过委托。

标签: objective-c xcode delegates


【解决方案1】:

代表团概览摘要:

  1. 创建一个@protocol,这是您希望可以从委托人调用但由您的委托人提供的方法。
  2. 在委托人的公共@interface 中添加委托@property。
  3. 在委托人的实现中使用委托属性,例如结果 = [self.delegate methodInProtocol]
  4. 在委托的@实现中的某处设置委托属性: delegator.delegate = self;
  5. 在委托中实现协议方法(包括@interface上的)

委托只是一个指向将为您实现必要方法的对象的指针。在您的情况下,我认为您希望 classA 能够调用 funcB 方法,但该 funcB 由其他人实现。

类中需要有一个委托属性,想让另一个类实现这些方法,然后在要成为委托的类中,它应该将委托属性设置为 self。

正如其他人所指出的,您没有设置您的委托。在 B 类的某个地方,你需要一个

ClassA.delegate = self;

【讨论】:

  • 很抱歉没有写出错误的地方。我认为这很明显。无论如何,非常感谢 - 我按照你说的做了(classa.delegate = classb),一切正常。
  • 没问题 - 我自己只做了几个月的 Obj-C 并且在过去几个月内对代表有半体面的理解。你真的在做 classA.delegate=classB 吗?如果是,你在哪里做?您应该在 classB 中执行 classA.delegate = self。
  • 其实我写这个是为了帮助我理解代表。我想让子 UIViewController 与它的父级通信,但它没有用,所以我写了这个来帮助我找到错误。现在一切正常。
【解决方案2】:
ClassA* classa = [[ClassA alloc] init];
[classa start];

看来您需要设置classa 的委托。通常,您希望调用-start 来调用委托方法,但classa 此处没有委托。这样做:

ClassB* classb = [[ClassB alloc] init];
ClassA* classa = [[ClassA alloc] init];
classa.delegate = classb;
[classa start];

【讨论】:

    【解决方案3】:
    1. 您从不设置委托
    2. 您通常使用assign 代表而不是retain 他们以避免保留循环。 (分配委托的对象通常会对对象有强引用,并负责在完成后将委托设置为nil

    #import <Foundation/Foundation.h>
    @protocol CommDelegate <NSObject>
    @required
    -(void)funcB;
    @end
    
    @interface ClassA : NSObject
    {
        id <CommDelegate> delegate;
    }
    @property (assign) id delegate; //assign
    -(void)funcB;
    @end
    

    这是重要的部分:

    ClassA* classa = [[ClassA alloc] init]; //Consider creating an init method that accepts the delegate
    classa.delegate = self; //Assuming self conforms to CommDelegate
    [classa start];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-06
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 2019-01-13
      • 2011-02-18
      • 2019-09-18
      相关资源
      最近更新 更多