Cocoa - loadNibNamed:owner:topLevelObjects:来自已加载的包

 田景撩人_108 发布于 2023-02-02 19:20

在基于文档的Cocoa应用程序中,我使用以下方法从外部包中实例化几个对象(插件):

- (NSMutableArray *)getPluginsOfType:(Class)type;
{
    NSBundle *main = [NSBundle mainBundle];
    NSArray *allPlugins = [main pathsForResourcesOfType:@"bundle" inDirectory:@"../PlugIns"];

    NSMutableArray *availablePlugins = [NSMutableArray array];

    for (NSString *path in allPlugins)
    {
    NSBundle *pluginBundle = [NSBundle bundleWithPath:path];
    [pluginBundle load];
    Class principalClass = [pluginBundle principalClass];
    [availablePlugins addObject:principalClass];
    }
return availablePlugins;
}

在每个文件中,在init上加载一个nib文件,它将根视图与我的插件类中的属性绑定在一起.下面是一个最小的插件类定义:

@interface Plugin

@property (strong) IBOutlet NSView *thePluginView;

@end

@implementation Plugin

- (instancetype)init
{
    self = [super init];
    if (self)
    {
        [NSBundle loadNibNamed:@"NibName" owner:self];
    }
    return self;
}

@end

虽然这很好用,但我想将上面的调用替换为NSBundle(因为它已被OS X 10.8+弃用),并将其替换为:

[[NSBundle mainBundle] loadNibNamed:@"NibName" owner:self topLevelObjects:nil];

但是,在这种情况下使用mainBundle自然无法在我的Plugin类中设置顶级对象引用,我怀疑mainBundle与Plugin的bundle无关.

我将如何实现这一目标?有没有办法找到"当前"的包(插件类来自的包,所以说)?

谢谢.

1 个回答
  • 我不清楚你究竟在问什么 - 你的应用程序包中没有的"加载类"来自哪里,你在"加载类"中究竟是什么意思?

    也许以下内容会有所帮助:

    loadNibNamed:owner:topLevelObjects: 是一个实例方法,并从实例表示的包中加载.

    在您的示例中,您使用的实例[NSBundle mainBundle]是通过via获取的,因此从应用程序主包中加载了nib.

    没有"当前捆绑"概念,但您可以获得NSBundle表示其他捆绑的实例,例如使用NSBundle"类"方法bundleWithURL.因此,要从另一个bundle加载一个nib,首先创建一个NSURL引用该bundle,然后NSBundle根据它创建一个nib,最后加载nib.

    HTH

    附录 - 问题更新后

    从弃用+loadNibName:owner:方法的描述owner:

    如果此对象的类具有关联的包,则搜索该包以查找指定的nib文件; 否则,此方法在主捆绑中查找.

    这是您在使用时需要复制的内容-loadNibNamed:owner:topLevelObjects:.你需要该方法NSBundlebundleForClass:返回的NSBundle动态加载的类对象.

    因此,在您的Plugin课程中,您应该能够找到它所加载的包[NSBundle bundleForClass:[self class]],然后调用-loadNibNamed:owner:topLevelObjects:它.

    2023-02-02 19:26 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有