暴露于外部世界的同一文件中的Objective-c类别

时间:2014-10-16 09:27:07

标签: ios objective-c uiviewcontroller

我见过一个类本身实现了一个类别。代码如下:

.h文件:

#import <UIKit/UIKit.h>
@interface BPTopTabBarViewController : UIViewController

@end

@interface UIViewController (BPTopTabBarViewController)
@property (nonatomic, readonly) BPTopTabBarViewController *topTabBarViewController;
@end

.m文件:

#import "BPTopTabBarViewController.h"
#import <objc/runtime.h>
@implementation UIViewController (BPTopTabBarViewController)
- (BPTopTabBarViewController *)topTabBarViewController
{
    return objc_getAssociatedObject(self, BPTopTabBarViewControllerKey);
}

- (void)setTopTabBarViewController:(BPTopTabBarViewController *)topTabBarViewController
{
    objc_setAssociatedObject(self, BPTopTabBarViewControllerKey, topTabBarViewController, OBJC_ASSOCIATION_ASSIGN);
}
@end

@interface BPTopTabBarViewController () {
}

@end

@implementation BPTopTabBarViewController
...
@end

我的问题是:

  1. 使用UIViewController类别引入getter和setter有什么意义?根据我的说法,只有BPTopTabBarViewController的类或它的子类才能看到类别,因为在.h文件中没有声明类别标题(#import“UIViewController + BPTopTabBarViewController”)。

  2. 我可以看到UINavigationController也有这样的结构:

    @interface UIViewController(UINavigationControllerItem)

  3. 这里我们总是可以调用一个UIViewController类或它的子类self.navigationController,当它在UINavigationController类中编写时,该类如何暴露给UIViewController? 我也没有在UINavigationController.h文件中看到类别标题:

    //  Copyright (c) 2007-2014 Apple Inc. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import <CoreGraphics/CoreGraphics.h>
    #import <UIKit/UIViewController.h>
    #import <UIKit/UIKitDefines.h>
    #import <UIKit/UIInterface.h>
    #import <UIKit/UIGeometry.h>
    #import <UIKit/UIPanGestureRecognizer.h>
    #import <UIKit/UITapGestureRecognizer.h>
    
    1. 如果我想将类别暴露给特定的UIViewController类,我该怎么办?

    2. 如果我想全局公开该类别,我应该将#import“BPTopTabBarViewController.h”放入project-Prefix.pch文件吗?

2 个答案:

答案 0 :(得分:1)

我正在努力弄清楚你从哪里得到你的信息,因为大部分内容似乎来自不准确的来源,因为问题没有多大意义。该类别的要点是能够在任何 UIViewController或其子类上调用此新方法,即使无法访问其源代码。

例如:

UIViewController *foo = [UIViewController new];
BPTopTabBarViewController *bar = foo.topTabBarViewController: //This will compile now

您可能遇到的部分误解实际上是在一个类别的括号内。这是不是特别是任何东西的名称,它只是一个标识符。当你创建一个类别时,它被添加到的类是外部括号中的类。

UIViewController (BPTopTabBarViewController)表示名为“BPTopTabBarViewController”的类别,它将影响UIViewController

使用它所需的只是#import "BPTopTabBarViewController.h",无论你想在哪里使用它,如果你想在任何地方使用它,都可以在.pch文件中使用。

答案 1 :(得分:1)

答案

  1. 这将使UIViewController类及其子类能够在topTabBarViewController的属性上调用setter和getter。

  2. 与1相同。

  3. 只需将BPTopTabBarViewController.h导入.m或.h。

  4. 只需在Prefix.pch文件中包含BPTopTabBarViewController.h。