我一直在创建一个cocoa静态库,其中我有一个公共的nsobject文件,我在其中创建了一个自定义委托。在应用程序中,我导入了nsobject文件并实现了委托,但委托没有被调用...静态库名称是glamApi。
库中NSObject的SKUIDPasser.h文件
#import <Foundation/Foundation.h>
@protocol SubClassDelegate <NSObject>
@required
- (void)MethodNameToCallBack:(NSString *)s;
@end
@interface SKUIDPasser : NSObject
-(void)getSKUIDsFromCart:(NSString *)SKUIDs;
@property (nonatomic, weak) id <SubClassDelegate> delegatePasser;
@end
和SKUIDPasser.m文件
#import "SKUIDPasser.h"
@implementation SKUIDPasser
@synthesize delegatePasser;
-(void)getSKUIDsFromCart:(NSString *)SKUIDs{
NSLog(@"getSKUIDsFromCart %@",SKUIDs);
[delegatePasser MethodNameToCallBack:SKUIDs];
}
@end
从静态库中的Viewcontroller
调用该方法- (IBAction)CartShowEvent:(id)sender {
if (![cartBadge isHidden]) {
buyClicked = TRUE;
[self loadCart];
[self showCartItemsAll];
self.cartView.frame = self.view.bounds;
[self.view addSubview:self.cartView];
SKUIDPasser *pass = [[SKUIDPasser alloc] init];
[pass getSKUIDsFromCart:@"sssss"];
} else {
[Utilities alert:@"No products to display !!!"];
}
}
自定义委托必须实现的Viewcontroller Viewcontroller.h
#import <glamAPI/SKUIDPasser.h>
@interface ViewController : UIViewController<SubClassDelegate>{
SKUIDPasser *sk;
}
Viewcontroller.m
- (void)viewDidLoad {
[super viewDidLoad];
sk = [[SKUIDPasser alloc] init];
sk.delegatePasser = self;
NSLog(@"sk.delegatePasser %@",sk.delegatePasser);
}
- (void)MethodNameToCallBack:(NSString *)s
{
NSLog(@"MethodNameToCallBack %@",s);
}
我没有收到任何错误,但方法没有调用..请帮我解决这个问题
答案 0 :(得分:0)
您在(IBAction)CartShowEvent:(id)sender
内调用的SKUIDPasser对象和您设置委托的SKUIDPasser对象不同。
只是为了测试,尝试在设置委托后调用方法[sk getSKUIDsFromCart:@"sssss"];
,您将看到它将被调用,因为此实例已正确设置委托:
<强> ViewController.m 强>
- (void)viewDidLoad {
[super viewDidLoad];
sk = [[SKUIDPasser alloc] init];
sk.delegatePasser = self;
[sk getSKUIDsFromCart:@"sssss"];
NSLog(@"sk.delegatePasser %@",sk.delegatePasser);
}
- (void)MethodNameToCallBack:(NSString *)s
{
NSLog(@"MethodNameToCallBack %@",s);
}
更新
我更新了我的答案,以帮助您从静态库中调用触发器
<强> ViewController.m 强>
- (void)viewDidLoad {
[super viewDidLoad];
sk = [[SKUIDPasser alloc] init];
sk.delegatePasser = self;
/*
You now can pass this variable to the static library to get called
from there ...
example:
viewControllerOnStaticLibrary.passer = sk;
*/
NSLog(@"sk.delegatePasser %@",sk.delegatePasser);
}
- (void)MethodNameToCallBack:(NSString *)s
{
NSLog(@"MethodNameToCallBack %@",s);
}
<强> Viewcontroller_in_static_library.h 强>
@property (nonatomic, strong) SKUIDPasser *passer;
<强> Viewcontroller_in_static_library.m 强>
- (IBAction)CartShowEvent:(id)sender {
if (![cartBadge isHidden]) {
buyClicked = TRUE;
[self loadCart];
[self showCartItemsAll];
self.cartView.frame = self.view.bounds;
[self.view addSubview:self.cartView];
//now you are calling the same instance
[self.passer getSKUIDsFromCart:@"sssss"];
} else {
[Utilities alert:@"No products to display !!!"];
}
}
答案 1 :(得分:0)
您需要了解的第一件事是,类的每个实例对象都是完全不同的实体,并分别维护它的状态。
在您的情况下,您已在viewDidLoad:
中创建了静态库的对象并相应地设置了委托,但是当您调用方法getSKUIDsFromCart时,您正在使用您从未设置委托属性的其他实例。这就是没有回调的原因。
要解决此问题,您可以在拨打电话之前在方法CartShowEvent:
中设置委托,类似这样
SKUIDPasser *pass = [[SKUIDPasser alloc] init];
pass.delegatePasser = self;
[pass getSKUIDsFromCart:@"sssss"];
但是我建议您应该使用已在viewDidLoad:
- (IBAction)CartShowEvent:(id)sender {
if (![cartBadge isHidden]) {
buyClicked = TRUE;
[self loadCart];
[self showCartItemsAll];
self.cartView.frame = self.view.bounds;
[self.view addSubview:self.cartView];
//No need to create another object.
//SKUIDPasser *pass = [[SKUIDPasser alloc] init];
//Use the previously created instance object
[sk getSKUIDsFromCart:@"sssss"];
}
else {
[Utilities alert:@"No products to display !!!"];
}
}