app delegate未触发

时间:2011-05-19 13:57:40

标签: objective-c ios cocoa-touch

  

可能重复:
  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];
}

然而,为什么不被召唤?

3 个答案:

答案 0 :(得分:5)

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

所以self.delegate是零,因为你可以发送任何消息给nil,没有发生

你有((TestAppDelegate *)[[UIApplication sharedApplication]).delegate = self还是 ((TestAppDelegate *)[[UIApplication sharedApplication]).delegate = aObject某个地方,selfaObject符合您的LoginDelegate

请参阅:DelegationProtocols

答案 1 :(得分:3)

你已经声明了协议,并且你已经在你的委托类中实现了它,但是你实际创建了另一个类的实例并将其设置为app delegate的委托属性的值吗?

在您的app delegate中,您有以下一行:

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;
}

答案 2 :(得分:1)

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

协议如:

@protocol LoginDelegate

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

@end

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

@interface SomeOtherClass : NSObject <LoginDelegate>

在TestAppDelegate中声明属性时如下:

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

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

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