2016-11-28 109 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 ...