除了我读过的几篇文章和官方页面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 也与源代码交互,但看起来更强大,但级别更低。
我想知道的是:
https://github.com/apple/swift/blob/master/tools/SourceKit/docs/Protocol.md
谢谢
我正在尝试使用popover segue将动态UITableViewCell连接到故事板中的导航控制器.
为此,我从单元格拖动到导航控制器,选择"popover"作为segue,然后为其分配一个标识符.以这种方式,segue的锚点成为细胞.
使用此配置,我从编译器中收到此错误:
Couldn't compile connection: <IBCocoaTouchOutletConnection:0x40114c920 <IBProxyObject: 0x40114c540> => anchorView => <IBUITableViewCell: 0x4012576c0>>
Run Code Online (Sandbox Code Playgroud)
我想要做的只是每次选择一个单元格时打开一个弹出控制器.如果我尝试做同样的事情但指定另一种segue(推或模态......)没有错误.我已经尝试从头开始创建一个新的示例项目,只包含所需的组件,但错误仍然存在.
谢谢阅读.


要从代码创建两个视图控制器之间的父/子关系,基本上只需执行以下操作:
[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中所做的:
图片中的第一个"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
我已经在我的项目中成功集成了three20框架,并且我已经扩展了TTPhotoViewController以添加一些其他功能.
现在我需要为TTPhotoViewController加载的TTPhotoView添加一些子视图.特别是我想在每个TTPhotoView加载后添加子视图.这些子视图表示图像上的合理区域,因此它们应与图像成比例缩放.用户可以点击子视图以获取有关图像的额外信息.
我不知道如何实现这种行为.我应该扩展TTPhotoView并确保TTPhotoViewController使用此扩展版本而不是其TTPhotoView吗?
有人能指出我正确的方向吗?谢谢
有没有办法将NSMenu类似对象显示为 a 的内容NSPopover?
本质上,我想在您右键单击应用程序图标时重现 macOS Dock 所做的事情(我不介意这里的深色背景,我只对以类似弹出框的窗口样式显示菜单感兴趣指向其目标的箭头)。
我一直在研究是什么NSPopUpButton,但我找不到以这种方式配置这个组件的方法;它有一个,arrowPosition但这实际上是指按钮本身上箭头的方向。也是NSMenu一个NSObject又一次,我看不到一种干净的方式来抓取它的视图并将其添加到弹出窗口中,所以我想这是不可能的,但也许你有更好的主意?
感谢您的任何建议!
我的自定义子类扩展UIControl(EditableImageView)基本上它包含3个子视图:
所有类都很好但现在我想将从这个类生成的一些事件连接到另一个.特别是当按下按钮时,我想将事件转发给所有者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) 我有一个基于导航控制器的应用程序,里面有5个视图控制器.当我推动一个视图控制器时,我会分配一些内存,当我回到popViewController时,我的delloc()方法被正确调用.我确信我推送和弹出的每个视图控制器都以正确的方式调用dealloc.
然而,当我使用Instruments运行应用程序时(从性能工具开始 - >对象分配,泄漏),我有一种奇怪的行为.当一个视图控制器弹出时,内存使用量不会减少,确切地说它没有按预期减少:当我启动应用程序时它使用950 KB,然后我推送第一个视图控制器,内存使用量增加到1,56MB ,最后我弹出视图控制器,内存使用量现在为1,55MB.
这种行为对吗?我确信每当我弹出一个视图并且Leaks仪器没有显示任何内存泄漏时,每个dealloc方法都会被正确调用.我想操作系统以某种方式"保留"视图,以便第二次推送同一个视图控制器时加载过程要快得多......
有人可以确认这种行为是对的吗?谢谢
给定 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) ),
我想知道这个实现的复杂性是多少:
例如:如果已经添加了 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) iphone ×3
algorithm ×1
events ×1
instruments ×1
ios ×1
macos ×1
memory-leaks ×1
merge ×1
nspopover ×1
segue ×1
sourcekit ×1
storyboard ×1
subclass ×1
three20 ×1
uicontrol ×1
uitableview ×1
xcodekit ×1