我在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];
}
然而,为什么不被召唤?
答案 0 :(得分:5)
它没有被调用,因为你没有把东西设置为委托(我假设)。
所以self.delegate是零,因为你可以发送任何消息给nil,没有发生
你有((TestAppDelegate *)[[UIApplication sharedApplication]).delegate = self
还是
((TestAppDelegate *)[[UIApplication sharedApplication]).delegate = aObject
某个地方,self
或aObject
符合您的LoginDelegate
?
请参阅:Delegation和Protocols
答案 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的委托属性分配了任何内容。