【问题标题】:app delegate not triggered [duplicate]应用程序委托未触发[重复]
【发布时间】:2012-08-03 01:22:30
【问题描述】:

可能重复:
delegate not being called

我在我的 appdelegate 类中声明了一个委托,所以它看起来像:

@protocol LoginDelegate

- (void) loadData:(NSObject *)viewCon;

@end

@class RootViewController;

@class DetailViewController;


@interface TestAppDelegate : NSObject <UIApplicationDelegate, LoginViewControllerDelegate, RKObjectLoaderDelegate> {
   id <LoginDelegate> delegate;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UISplitViewController *splitViewController;
@property (nonatomic, retain) IBOutlet RootViewController *rootViewController;
@property (nonatomic, retain) IBOutlet DetailViewController *detailViewController;
@property (nonatomic, assign) id <LoginDelegate> delegate;

@end

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //some code
         [self.delegate loadData:self];
    //some code

    return YES;
}

在我的另一个类中,我实现了这个委托:

- (void) loadData:(NSObject*)viewCon
{
    NSLog(@"LOADING DATA");
    [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/groups.json" delegate: self];
}

但是,为什么它没有被调用?

【问题讨论】:

  • 你在哪里设置代理?
  • 设置委托是什么意思?
  • 您正在将 UIApplicationDelegate 方法 didFinishLaunchingWithOptions 中的 loadData 消息发送到 self.delegate。你在哪里设置self.delegate?如果您使用模板创建了项目,则 appDelegate 类直接从 NSObject 继承,并且没有委托字段。
  • @Nick,是的,这是一个使用模板创建的项目,它直接从 NSObject 继承......我只是很困惑,因为我通常在创建它时设置委托,在这种情况下我没有知道谁创建了应用委托

标签: objective-c ios cocoa-touch


【解决方案1】:

它没有被调用,因为你没有将某些东西设置为委托(我假设)。

所以 self.delegate 是 nil,因为你可以向 nil 发送任何消息,所以什么都不会发生

你有((TestAppDelegate *)[[UIApplication sharedApplication]).delegate = self((TestAppDelegate *)[[UIApplication sharedApplication]).delegate = aObject 某处,其中selfaObject 符合您的LoginDelegate

请参阅:DelegationProtocols

【讨论】:

  • 是的,我确实做到了。我在上面编辑了我的代码
  • 其实是 self.delegate 是 nil...
  • 我曾经像上面那样声明代表,它通常可以工作。我从来没有你写过的代码
  • 嗯,也许中间的委托被释放了?
  • 对我来说,它看起来像你在 appdelegate 中设置的委托,而 RKObjectManager 的委托或完全不同的东西。
【解决方案2】:

您已经声明了协议,并在您的委托类中实现了它,但您是否真的创建了另一个类的实例并将其设置为应用程序委托的委托属性的值?

在您的应用委托中,您有以下行:

id <LoginDelegate> delegate;

这会创建一个可以指向委托对象的空变量,就像创建整数变量时一样

int x;

您已经创建了一个可以保存整数的变量。但是当您第一次创建变量时,它没有值。您需要在使用之前为变量分配一个实际值。

int x;
y = 5 + x;  // This makes no sense, because you haven't given x a value, right?

在您发布的代码中,您永远不会为您的 appDelegate 的委托变量赋值。您需要执行以下操作:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    MyDelegateObject *delegateObject = [[MyDelegateObject alloc] init];
    delegate = delegateObject;
    // now you can send the delegate a message, because the delegate exists!
    [self.delegate loadData:self];
    return YES;
}

【讨论】:

  • 你能在上面显示一些代码吗?
  • 在某些时候你需要说:myTestAppDelegate.delegate = someDelegateObject;
  • 问题是我的代表是零……是因为这个吗?
  • 是的。委托不分配自己。在某些时候,您需要创建并分配它。
  • 但我需要将它分配给什么?
【解决方案3】:

好的,这里总结了很多讨论。

类似的协议:

@protocol LoginDelegate

- (void) loadData:(NSObject *)viewCon;

@end

只是任何类都可以实现的一组方法。当您声明该协议时,您只是在说,“这是一组我想用一个名称引用的方法。”然后任何自定义类都可以通过在其@interface 行中包含它来说“我实现了这个集合(协议)中的方法”。比如:

@interface SomeOtherClass : NSObject <LoginDelegate>

当您像这样在 TestAppDelegate 中声明属性时:

@property (nonatomic, assign) id <LoginDelegate> delegate;

它与创建任何其他属性没有什么不同,例如 NSString 或其他。您只是说 TestAppDelegate 将具有一个属性,该属性是未知类 (id) 的某个对象,它实现了 LoginDelegate 协议 (&lt;LoginDelegate&gt;) 中列出的方法。

现在,像任何其他属性一样,您需要为该值分配一个对象。如果您有一个名为 myString 的 NSString 属性,则 myString 将为零,直到您为其分配了一些字符串。同样,您有一个任意称为“委托”的属性,该属性需要分配给它的东西。请注意,许多其他类(如 RKObjectManager)也使用委托,并且也将它们称为“委托”。仅仅因为您将称为“委托”的东西分配给一个对象并不意味着您已将任何东西分配给属于您的 TestAppDelegate 的委托属性。

【讨论】:

  • 是的,我明白了。但是通常我从创建这个类的类中设置/分配委托。就我而言,我不知道是谁创建了 AppDelegate
  • 对象可以设置自己的委托。比如:self.delegate = someOtherObject;
猜你喜欢
  • 2015-11-27
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 2023-04-11
  • 2018-11-27
  • 1970-01-01
  • 2023-03-07
  • 2013-09-27
相关资源
最近更新 更多