iOS之插件开发

插件的简介

  • Xcode插件,必须是与Xcode是同一个级别的应用,也就是必须也是mac OS APP
  • 改变Xcode常规的操作被称为插件
  • Xcode著名的插件文档注释,颜色提示,图片选择等等...

插件的开发步骤

  • 需要配置项目中的pist文件
  • 需要修改和添加plist文件只中的多处
  • 操作繁琐,步骤麻烦
  • 这时候,有一个专门用来开发插件的插件Xcode Plugin

插件

  • 在新建项目中的OS X中多了一个Xcode Plugin模板
  • 选择模板中的Xcode Plugin进行开发

模板分析

- (id)initWithBundle:(NSBundle *)plugin
{
    if (self = [super init]) {
        // reference to plugin's bundle, for resource access
        // 应用插件的资源包,用于资源访问
        // 在NSObject_Extension中初始化的时候设置
        self.bundle = plugin;
        // 发送Xcode程序启动的通知
        // 调用didApplicationFinishLaunchingNotification方法
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(didApplicationFinishLaunchingNotification:)
                                                     name:NSApplicationDidFinishLaunchingNotification
                                                   object:nil];
    }
    return self;
}
  • 获取到启动Xcode的通知调用
/**
 *  当Xcode启动的时候调用
 *
 */
- (void)didApplicationFinishLaunchingNotification:(NSNotification*)noti
{
    // 接收到通知后移除通知
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSApplicationDidFinishLaunchingNotification object:nil];
    
    // 获取到Edit菜单
    NSMenuItem *menuItem = [[NSApp mainMenu] itemWithTitle:@"Edit"];
    if (menuItem) {
        // 添加一条分割线
        [[menuItem submenu] addItem:[NSMenuItem separatorItem]];
        // 创建一个菜单项目
        // 设置菜单项目的点击事件
        NSMenuItem *actionMenuItem = [[NSMenuItem alloc] initWithTitle:@"Do Action" action:@selector(doMenuAction:) keyEquivalent:@""];
        // 将事件交给当前类处理
        [actionMenuItem setTarget:self];
        // 添加子标题
        [[menuItem submenu] addItem:actionMenuItem];
    }
}
  • 点击菜单上的Edit中的Do Action按钮调用
// 弹出弹框
- (void)doMenuAction:(NSMenuItem *)item
{
    
    NSLog(@"=====%@   item = %@",item.keyEquivalent,item);
    NSAlert *alert = [[NSAlert alloc] init];
    [alert setMessageText:[NSString stringWithFormat:@"Hello, World%@",item.keyEquivalent]];
    [alert runModal];
}

需求

  • 在我们添加文件的时候都会选择将文件添加到target里面
  • 那需求就是使用几个其它的的选项替代掉target

需求分析

  • 所有的target都在一个白色的矩形框里
  • 其实这个巨型框就相当于我们iOS中的UITableview,而在OS X 中是NSTableView
  • 每一行显示的内容是NSCell
  • 那么首先拿到NSTableView
  • 然后拿到这个Cell便可以改变里面的内容

实现步骤

  • 拿到NSTableView
    • 我们可以使用遍历这个界面中的subviews来拿到NSTableView
    • 在没有打开添加文件界面的时候是没有创建NSTableView,而在创建视图初始化控件的大小的时候会调用NSViewDidUpdateTrackingAreasNotification通知
    • 所以我们可以监听这个通知,在打开添加文件窗口的时候就能拿到里面所有的对象
  • 使用snip截屏可以看到白色的视图的大概大小为320 X 170
  • 那么我们遍历子控件的视图并且打印他们的frame
  • 查看NSTableView发现正是我们需要找到的
  • 拿到NSTableView打印内部的的数据源
  • 我们可以发现数据源是Xcode3TargetMembershipDataSource类型的
  • Xcode3TargetMembershipDataSource是Xcode的私有类
  • 位置是:/Applications/Xcode.app/Contents/PlugIns/Xcode3UI.ideplugin/Contents/MacOS/Xcode3UI
  • 如果需要使用Xcode3TargetMembershipDataSource需要将Xcode3UI拖入我们的项目里,但是不要勾选Copy items if needed,否则可能会有冲突
  • 将Xcode3TargetMembershipDataSource拖入项目中

你可能感兴趣的:(iOS之插件开发)