2016-11-28 112 views
0

我正在开发一个SDK,在我们的SDK集成的应用程序中调用任何UIViewControllerviewDidLoad方法时,我将不得不打电话给我们的服务器。我试图用分类,如下图所示:iOS SDK - 跟踪viewDidLoad方法

#import "DymmyViewController.h" 

@interface DymmyViewController() 
@end 

@protocol DummyDelgate; 
@interface UIViewController (DummyAddition) 
-(void)viewDidLoad; 
@end 

@implementation DymmyViewController 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
} 
@end 

@implementation UIViewController (DummyAddition) 

-(void)viewDidLoad{ 
    //server call 
} 
@end 

什么也没有发生这个,我得到一个警告说“Category is implementing a method which will also be implemented by its primary class

我明白这不是得到这个工作的方式。有没有其他办法可以做到这一点?可能会使用NSNotification

+0

为什么要这么做-----接口的UIViewController(DummyAddition) - (无效)viewDidLoad中; @end ? – User511

+0

1)在类类中声明'viewDidLoad'是没有意义的,因为'UIViewController'已经有了这样的方法。 2)切勿尝试覆盖类别中的现有方法。这是未定义的行为。类别只应添加新的方法/属性,而不要试图替换它们。 – rmaddy

+1

宁愿有一个基本的视图控制器,您的所有viewcontroller继承,并做任何你需要做的基地 – Fonix

回答

0

这是使用协议和委托的方式。授权是一种很好的技术,可以从一个班级回复到另一个班级。

DummyView.h

#import <UIKit/UIKit.h> 
@class DummyView; 

@protocol DummyViewDelegate <NSObject> 
- (void)addItemViewController; 
@end 

@interface DummyView : UIViewController 
@property (nonatomic, weak) id <DummyViewDelegate> delegate; 


@end 

DummyView.m

#import "DummyView.h" 

@interface DummyView() 
@end 

@implementation DummyView 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
- (IBAction)backButtonClicked:(id)sender { 
    [self.delegate addItemViewController]; 
} 

ViewController.h

#import <UIKit/UIKit.h> 
#import "DummyView.h" 

@interface ViewController : UIViewController <DummyViewDelegate> 

@end 

ViewController.m

#import "ViewController.h" 

@interface ViewController() 
{ 
    DummyView *acController; 
} 
@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    acController.delegate = self; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (void)addItemViewController{ 
} 
0

为什么不直接在SDK中提供的跟踪视图控制器。然后,应用程序开发者应该使这个基本类型的所有视图控制器。您可能需要几个基类(例如,如果您也使用TableViewControllers)。

在SDK:

@interface TrackingViewController : UIViewController 
@end 

@implementation TrackingViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Make the call here 
    // .... 
} 

在应用程序:

#import "SDK.h" 

@interface MyViewController : TrackingViewController ...