小编ggo*_*d75的帖子

XcodeKit 和 SourceKit

除了我读过的几篇文章和官方页面https://developer.apple.com/documentation/xcodekit#topics https://github.com/apple/swift/tree之外,我没有 XcodeKit 和 SourceKit 的经验 /master/tools/SourceKit

我试图了解两者之间的差异以及他们到底能够做什么。

我认为 XcodeKit 本质上允许您向 Xcode 菜单添加命令,并可以通过创建应用程序扩展与您打开的源代码进行交互,然后您也可以通过 App Store 分发该应用程序扩展。据我所知,XcodeKit 只让您从当前聚焦的文件(不是项目中的所有文件)获取信息,然后您可以获取选定的文本等...至少这是我在 Xcode 9 之前读到的内容,不确定是否有事情现在好多了。

SourceKit 也与源代码交互,但看起来更强大,但级别更低。

我想知道的是:

  • SourceKit 是否可以访问您开放项目中的所有 Swift 和 ObjC 类,然后从中提取信息?例如,假设我想提取结构和类、每个类的方法等信息,然后从中生成某种输出。如何使用 SourceKit(或 XcodeKit?)来做到这一点?
  • 任何示例链接都会很棒!
  • SourceKit 仍然有效并受到 Apple 支持吗?

https://github.com/apple/swift/blob/master/tools/SourceKit/docs/Protocol.md

谢谢

sourcekit xcodekit

9
推荐指数
1
解决办法
4421
查看次数

尝试从动态UITableViewCell执行popover segue时编译错误

我正在尝试使用popover segue将动态UITableViewCell连接到故事板中的导航控制器.
为此,我从单元格拖动到导航控制器,选择"popover"作为segue,然后为其分配一个标识符.以这种方式,segue的锚点成为细胞.

使用此配置,我从编译器中收到此错误:

Couldn't compile connection: <IBCocoaTouchOutletConnection:0x40114c920  <IBProxyObject: 0x40114c540> => anchorView => <IBUITableViewCell: 0x4012576c0>>
Run Code Online (Sandbox Code Playgroud)

我想要做的只是每次选择一个单元格时打开一个弹出控制器.如果我尝试做同样的事情但指定另一种segue(推或模态......)没有错误.我已经尝试从头开始创建一个新的示例项目,只包含所需的组件,但错误仍然存​​在.

谢谢阅读.

在此输入图像描述

在此输入图像描述

storyboard uitableview ios segue

8
推荐指数
2
解决办法
3791
查看次数

如何在界面构建器中创建容器/子视图控制器关系

要从代码创建两个视图控制器之间的父/子关系,基本上只需执行以下操作:

[self addChildViewController:childViewController];
[self.view addSubview:childViewController.view];
Run Code Online (Sandbox Code Playgroud)

其中self是父视图控制器.
但是,如果我想完全从Interface Builder创建相同的关系呢?
或者换句话说:有没有办法使用Interface Builder重新创建方法addChildViewController的行为?
我没有找到很多关于这方面的文档,这是一篇关于该主题的未解决的帖子:https://devforums.apple.com/message/455758#455758

如果没有正确设置addChildViewController关系,任何旋转方法都不会转发到我的子视图控制器,这是我的问题所在.

这就是我在IB中所做的:

  1. 将"视图控制器"对象从"对象库"面板拖放到"对象"面板中
  2. 在身份检查器中,我已将其类更改为我的UIViewController子类("Items View Controller")
  3. 将视图插座连接到控制器
  4. 将所有其他所需的插座连接到控制器(列表名称,表视图)

图片中的第一个"View"对象是我的父视图控制器的视图,而突出显示的"View"是子视图控制器的视图("Item View Controller").

在此输入图像描述

容器控制器还通过另外的IBOutlet保留其子实例:

@property (nonatomic, strong) IBOutlet ItemsViewController *itemsViewController;
Run Code Online (Sandbox Code Playgroud)

谢谢


更新1:如果我在容器控制器的viewDidLoad中手动设置父/子关系,则所有旋转方法都会正确转发给子项.

[self addChildViewController:self.itemsViewController];
Run Code Online (Sandbox Code Playgroud)

但我真的不知道这是否是正确的做法,因为我想用IB做所有事情.


更新2:感谢@micantox提示他使用对象库中的"容器视图",我已将我的xib文件转换为Storyboard,现在子视图控制器已添加到其父级,所以我没有必要使用addChildViewController从代码中手动添加它,并按预期转发旋转方法.
"容器视图"基本上实现了嵌入segue,仅支持iOS 6.
这是我的Storyboard更新的截图:

在此输入图像描述

interface-builder uiviewcontroller uistoryboardsegue childviewcontroller container-view

7
推荐指数
1
解决办法
1万
查看次数

使用自定义TTPhotoView扩展TTPhotoViewController

我已经在我的项目中成功集成了three20框架,并且我已经扩展了TTPhotoViewController以添加一些其他功能.

现在我需要为TTPhotoViewController加载的TTPhotoView添加一些子视图.特别是我想在每个TTPhotoView加载后添加子视图.这些子视图表示图像上的合理区域,因此它们应与图像成比例缩放.用户可以点击子视图以获取有关图像的额外信息.

我不知道如何实现这种行为.我应该扩展TTPhotoView并确保TTPhotoViewController使用此扩展版本而不是其TTPhotoView吗?

有人能指出我正确的方向吗?谢谢

iphone three20 ttphotoviewcontroller

5
推荐指数
1
解决办法
2500
查看次数

如何显示嵌入在 NSPopover 中的 NSMenu?

有没有办法将NSMenu类似对象显示为 a 的内容NSPopover

本质上,我想在您右键单击应用程序图标时重现 macOS Dock 所做的事情(我不介意这里的深色背景,我只对以类似弹出框的窗口样式显示菜单感兴趣指向其目标的箭头)。

我一直在研究是什么NSPopUpButton,但我找不到以这种方式配置这个组件的方法;它有一个,arrowPosition但这实际上是指按钮本身上箭头的方向。也是NSMenu一个NSObject又一次,我看不到一种干净的方式来抓取它的视图并将其添加到弹出窗口中,所以我想这是不可能的,但也许你有更好的主意?

感谢您的任何建议!

在此处输入图片说明

macos nspopupbuttoncell nspopupbutton nspopover

5
推荐指数
1
解决办法
346
查看次数

来自自定义UIControl子类的转发事件

我的自定义子类扩展UIControl(EditableImageView)基本上它包含3个子视图:

  • UIButton(UIButtonTypeCustom)
  • 的UIImageView
  • 的UILabel

所有类都很好但现在我想将从这个类生成的一些事件连接到另一个.特别是当按下按钮时,我想将事件转发给所有者viewcontroller,以便我可以处理该事件.问题是我无法弄清楚如何实现这种行为.在EditableImageView中,我可以使用[button addTarget:self action:@selector(buttonPressed :) forControlEvents:UIControlEventTouchUpInside]来捕捉触摸事件,但我不知道如何在buttonPressed选择器内转发它.我也试图实现touchesBegan,但它似乎从未被称为...

我想以这种方式从viewcontroller捕获按钮按下事件:

- (void)viewDidLoad {
[super viewDidLoad];

self.imageButton = [[EditableImageView alloc] initWithFrame:CGRectMake(50.0f, 50.0f, 80.0f, 80.0f)];
[imageButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:imageButton];
[imageButton setEditing:NO];
Run Code Online (Sandbox Code Playgroud)

}

这是我的UIControl子类初始化方法:

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self setBackgroundColor:[UIColor clearColor]];

        button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(0.0f, 0.0f, frame.size.width, frame.size.height);
        [button setImage:[UIImage imageNamed:@"nene_70x70.png"] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];

        [self addSubview:button];

        transparentLabelBackground = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"editLabelBackground.png"]];
        transparentLabelBackground.hidden = YES;
        [self addSubview:transparentLabelBackground];

        // create …
Run Code Online (Sandbox Code Playgroud)

iphone events subclass uicontrol

4
推荐指数
1
解决办法
3896
查看次数

弹出控制器时,UINavigationController内存不会减少

我有一个基于导航控制器的应用程序,里面有5个视图控制器.当我推动一个视图控制器时,我会分配一些内存,当我回到popViewController时,我的delloc()方法被正确调用.我确信我推送和弹出的每个视图控制器都以正确的方式调用dealloc.

然而,当我使用Instruments运行应用程序时(从性能工具开始 - >对象分配,泄漏),我有一种奇怪的行为.当一个视图控制器弹出时,内存使用量不会减少,确切地说它没有按预期减少:当我启动应用程序时它使用950 KB,然后我推送第一个视图控制器,内存使用量增加到1,56MB ,最后我弹出视图控制器,内存使用量现在为1,55MB.

这种行为对吗?我确信每当我弹出一个视图并且Leaks仪器没有显示任何内存泄漏时,每个dealloc方法都会被正确调用.我想操作系统以某种方式"保留"视图,以便第二次推送同一个视图控制器时加载过程要快得多......

有人可以确认这种行为是对的吗?谢谢

请参阅仪器的此截图

iphone memory-leaks instruments uinavigationcontroller

4
推荐指数
1
解决办法
4322
查看次数

合并两个列表的 O 复杂性

给定 2 个已排序的单链表,合并这些列表。

示例:
列表 1:1 2 3 5 7
列表 2:0 4 6 7 10
---> 0 1 2 3 4 5 6 7 7 10

尽管解决方案非常简单,并且使用或不使用递归有几种不同的问题实现(例如http://www.geeksforgeeks.org/merge-two-sorted-linked-lists/ 参见方法3) ),

我想知道这个实现的复杂性是多少:

  1. 如果其中一个列表为空,则返回另一个
  2. 否则,使用sortedInsert函数将第二个列表的每个节点插入第一个列表,该函数基本上扫描列表直到找到正确的位置。因为两个列表都已经排序,所以不需要每次都将节点与第一个列表中的所有节点进行比较,我可以从最后添加的节点开始比较。

例如:如果已经添加了 4,则继续前面的示例,我可以安全地从 4 开始下一个比较:
list1: 0 1 2 3 4 5 7
list2: 6 7 10
现在将 6 与 4 进行比较,而不是与 1 2 3 4 进行比较。 ..

如果我将一个元素与第一个列表中的所有元素进行比较,则其复杂度为 O(m*n),其中 m=#list2 和 n=#list1,但考虑到这种“优化”,复杂性是多少?

执行:

// Insert a new node in a sorted list
int sortedInsert(struct ListNode **head, …
Run Code Online (Sandbox Code Playgroud)

algorithm merge time-complexity singly-linked-list

4
推荐指数
1
解决办法
1万
查看次数