gpt4 book ai didi

ios - 暴露给外界的同一文件中的 Objective-C 类别

转载 作者:行者123 更新时间:2023-11-28 21:56:20 24 4
gpt4 key购买 nike

我见过一个在其自身上实现类别的类。代码如下:

.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)

这里我们总可以调用UIViewController的一个类或者它的子类self.navigationController,那么类目写在UINavigationController类中是如何暴露给UIViewController的呢?我也没有在 UINavigationController.h 文件中看到类别 header :

//  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 文件中?

最佳答案

我很难弄清楚您是从哪里获得信息的,因为大部分信息似乎都来自不准确的来源,因为这些问题没有多大意义。该类别的要点是能够在任何 UIViewController 或其子类上调用此新方法,甚至无需访问其源代码。

例如:

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

您可能存在的部分误解是类别括号内实际包含的内容。这不是任何特定的名称,它只是一个标识符。当你创建一个类别时,它被添加到的类是括号外面的类。

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

要使用它,您需要做的就是 #import "BPTopTabBarViewController.h" 任何您想使用它的地方,或者在您的 .pch 文件中,如果您想在任何地方使用它。

关于ios - 暴露给外界的同一文件中的 Objective-C 类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26400824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com