iPhone - 如何在我的静态库和使用该库的应用程序之间实现委托?

时间:2015-04-23 06:07:57

标签: ios iphone xcode delegates static-libraries

我一直在创建一个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);
}

我没有收到任何错误,但方法没有调用..请帮我解决这个问题

2 个答案:

答案 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 !!!"];
        }
    }