【问题标题】:iOS SDK - Track viewDidLoad methodiOS SDK - 跟踪 viewDidLoad 方法
【发布时间】:2016-11-28 04:50:35
【问题描述】:

我正在开发一个 SDK,每当在与我们的 SDK 集成的应用程序中调用任何UIViewControllerviewDidLoad 方法时,我都必须调用我们的服务器。我正在尝试使用如下所示的类别:

#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

【问题讨论】:

  • 你为什么要这样做-----interface UIViewController (DummyAddition) -(void)viewDidLoad; @end ?
  • 1) 在类类别中声明 viewDidLoad 是没有意义的,因为 UIViewController 已经有了这样的方法。 2) 永远不要试图覆盖类别中的现有方法。这是未定义的行为。类别应该只添加新的方法/属性,切勿尝试替换它们。
  • 而是有一个基础视图控制器,你的所有视图控制器都从它继承,并在基础视图控制器中做你需要做的任何事情
  • 你到底想要什么?
  • 只做分析 SDK 的工作。为用户提供一个方法,他将在每个 viewDidLoad 中调用该方法。为什么要把事情复杂化

标签: ios objective-c sdk categories


【解决方案1】:

这是使用协议和委托的方式。委托是从一个类响应另一个类的好技巧。

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{
}

【讨论】:

    【解决方案2】:

    为什么不在 SDK 中提供一个跟踪视图控制器。然后,应用程序开发人员应该将他们所有的视图控制器都设为这种基本类型。您可能需要几个基类(例如,如果您还使用 TableViewControllers)。

    在 SDK 中:

    @interface TrackingViewController : UIViewController
    @end
    
    @implementation TrackingViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        // Make the call here
        // ....
    }
    

    应用内:

    #import "SDK.h"
    
    @interface MyViewController : TrackingViewController ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多