我见过一个类本身实现了一个类别。代码如下:
.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
我的问题是:
使用UIViewController类别引入getter和setter有什么意义?根据我的说法,只有BPTopTabBarViewController的类或它的子类才能看到类别,因为在.h文件中没有声明类别标题(#import“UIViewController + BPTopTabBarViewController”)。
我可以看到UINavigationController也有这样的结构:
@interface UIViewController(UINavigationControllerItem)
这里我们总是可以调用一个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>
如果我想将类别暴露给特定的UIViewController类,我该怎么办?
如果我想全局公开该类别,我应该将#import“BPTopTabBarViewController.h”放入project-Prefix.pch文件吗?
答案 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)
答案
这将使UIViewController类及其子类能够在topTabBarViewController的属性上调用setter和getter。
与1相同。
只需将BPTopTabBarViewController.h导入.m或.h。
只需在Prefix.pch文件中包含BPTopTabBarViewController.h。