Category正在实现一个也可以在主类中实现的方法:`viewWillAppear:`

时间:2014-04-04 07:51:17

标签: ios objective-c oop objective-c-category

我正在尝试对UIViewController进行分类以覆盖viewWillAppear:。但得到这个警告。

  

类别正在实施一种也可以在初级中实施的方法   类

@implementation UIViewController (ViewWillAppearCategory)

-(void)viewWillAppear:(BOOL)animated
{
    //.........
}

@end

我想在所有屏幕中显示视图中的一些内容,所以我不想在所有屏幕中触摸。这就是为什么,请选择类别。

我可以在子类中实现一些方法,我可以在所有VC(所有屏幕)中调用该方法。但我不想要这个。它会在视图中自动调用会出现调用。这是否有任何想法,或在上面做任何错误?

注意:此代码仅出现在开发阶段,以用于某些测试目的。所以我在使用app store时会删除此代码。因此,在移除过程中应该更容易完成任务,即我不会触摸所有屏幕。在提交到应用商店期间,我不会保留此代码。

5 个答案:

答案 0 :(得分:11)

在这种情况下,您必须尝试Method Swizzling,这是一个非常好的形成概念,允许您更改现有选择器的实现。

有关详细信息和代码,请访问以下链接。

http://nshipster.com/method-swizzling/

答案 1 :(得分:6)

类别用于添加新方法,而不是覆盖现有方法。也许用这段代码创建一个UIViewController的子类,比如MyUIViewController:

-(void) viewWillAppear:(BOOL) animated {
    // do your "category" stuff
}

然后使用以下代码创建MyUIViewController的所有其他UIViewControllers子类:

-(void) viewWillAppear:(BOOL) animated {
    [super viewWillAppear:animated];
    // rest of code for this class
}

答案 2 :(得分:1)

我理解为什么你想要一个简单的解决方案来测试所有屏幕上的东西并轻松删除它的原因,但是:

  • 您无法在某个类别中调用super,也不会调用[super viewWillAppear:]可能会产生意外结果,具体取决于类及其特定实现。
  • Swizzling方法是一种黑客行为,当你从最终版本中删除它时,你的测试版本就会变得毫无用处,因为它可能表现得非常不同。

另一方面,创建一个正确覆盖UIViewController的{​​{1}}超类并不复杂:

  • 代码只属于一个类。无需为每个“屏幕”重复/维护代码。
  • 您只需要更改其他控制器的超类和Nib或Storyboards引用一次。
  • 您可以保留测试和发布的超类,行为也类似。
  • 你可以在超类中做更多的事情,而不是在类别中。

最终知道你想要达到的目标会很有趣。你可以通过实现viewWillAppear:来实现类似的事情,并跟踪控制器被推送和弹出。


至于UINavigationControllerDelegate documentation

  

在即将添加接收者视图之前调用此方法   到视图层次结构之前和配置任何动画之前   显示视图。您可以覆盖此方法以执行自定义任务   与显示视图相关联。例如,您可以使用它   将状态栏的方向或样式更改为的方法   与所呈现视图的方向或样式协调。   如果您覆盖此方法,则必须在实施中的某个时刻调用super。

同样,你不能从一个类别中做到这一点。

答案 3 :(得分:0)

您想达到的目标会破坏类别的目的。但是,除了子类化UIViewController之外还有另外一种方法,但你必须触摸每个控制器的viewWillAppear方法。

//UIViewController+CustomCategory.h
@interface UIViewConctroller (CustomCategory)

- (void)performCustomization;

@end

//UIViewController+CustomCategory.m
@implementation UIViewController (CustomCategory)

- (void)performCustomization {
    // Do custom stuffs...
}

@end

然后在每个控制器中

//MYViewController.m
#import "UIViewController+CustomCategory.h"

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self performCustomization];
}

答案 4 :(得分:0)

正如您所说,代码将仅在调试模式下执行。那么为什么你担心警告让你在发布删除你的类别时继续你的工作。

如果您甚至不需要使用相同的答案来查看警告,例如

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"

-(void)viewWillAppear:(BOOL)animated
{
    NSLog(@"I get callback here too");
}

#pragma clang diagnostic pop

但我会说要进行子类化,因为在XCode工具中删除现有的类也不是那么难。