我最近有一个案例,有人在init方法中添加了一个参数,并打破了另一个共享代码的项目.由于它只是一个警告,没有人意识到应用程序已被破坏,所以我试图将此警告转变为错误:
warning: instance method '-someMethod' not found (return type defaults to 'id')
Run Code Online (Sandbox Code Playgroud)
我发现你可以将其他C标志中的-Werror = foo传递给Xcode中的编译器,将警告变成错误,但我似乎无法找到'foo'应该是什么.我试过'未声明的选择器',但只捕获@selector案例.我已经尝试过-Werror-implicit-function-declaration,但似乎也没有抓住这种情况.
在偶然搜索巨大的clang源代码时,我发现'warn_inst_method_not_found'后尝试了'inst-method-not-found'和'instance-method-not-found'.
救命 ... ?
更新: 这是一个可以编译的示例(例如在CodeRunner中)以查看警告:https://gist.github.com/4045701
我是NSButtonCell的子类,用于自定义绘图(可自定义的主题).我想自定义复选框和单选按钮的绘制方式.
有谁知道如何检测按钮是复选框还是单选按钮?
只有-setButtonType:,没有getter,-showsStateBy和-highlightsBy似乎都没有为复选框提供任何唯一的返回值,这些复选框也不适用于带有图像和备用图像的常规按钮.
到目前为止,我已经找到了两个(不是非常漂亮)的变通方法,但它们可能会被MAS拒绝应用程序:
使用[self valueForKey:@"buttonType"].这是有效的,但由于方法不在标题中,我认为这是Apple不希望我做的事情.
覆盖-setButtonType:和-initWithCoder:在手动设置或从XIB设置时跟踪按钮类型.这里的问题是XIB情况,因为用于将按钮类型保存到磁盘的密钥没有记录.所以,我再次使用私有API.
我真的希望这是NSButtonCell的直接替代品,而不是强制客户端代码使用单独的ULIThemeSwitchButtonCell类用于复选框,第三个用于单选按钮.
我从Swift编译器收到一个奇怪的错误消息:
<unknown>:0: error: 'required' initializer 'init(arrayLiteral:)' must be provided by subclass of 'NSSet'
Foundation.NSSet:2:33: note: 'required' initializer is declared in superclass here
required public convenience init(arrayLiteral elements: Any...)
^
Run Code Online (Sandbox Code Playgroud)
请注意,我的代码都没有子类化NSSet(nor Set)。所以我不知道为什么斯威夫特认为我在做这件事,更不用说错误了。
我的项目有点特别,因为我有一些Objective-C类(通过Objective-C调用C ++代码)和一个module.map文件,可以让Swift调用C库。
编译Swift文件时发生错误(我是从几个Swift文件中获得的,但是只有其中一些使用C库,但是到目前为止,所有这些似乎都在与ObjC类进行对话)。如您所见,Swift没有错误的行号,尽管有人在继承NSSet。
有人看过吗?有谁知道如何诊断这个问题?我尝试注释掉部分代码,但似乎找不到任何有助于跟踪此问题的内容。
要强调的是:我没有做NSSet的任何子类化。我认为我什至没有在代码中使用NSSet。这就是Swift编译器似乎正在弥补的问题。
更新: 另一个问题使我想到,它可能与从Class对象实例化实例有关。我有一个Class我稍后要实例化的类:
@interface MYInfo : NSObject
@property Class myClass;
@end
Run Code Online (Sandbox Code Playgroud)
后来我使用Swift中的实例化它:
guard let myClass = info.myClass.init() as? MyClass else { return }
Run Code Online (Sandbox Code Playgroud)
如果我删除了这最后一行,错误消息就会消失。
作为一种更好地理解我的计算机的练习,作为一种工具,我用C++ 编写自己的shell.Stephen Brennan关于编写简单shell的文章非常有用.
然而,让我感到困惑的是如何处理按向上箭头和向下箭头以滚动我的命令历史记录.
我尝试了ncurses,但是它取代了整个屏幕,而系统提供的shell似乎只是继续写入终端.
我尝试使用tcgetattr关闭规范模式,但是虽然这可以让我在键入时按下箭头键,但它也会关闭文本导航的左/右箭头键和退格键以及Ctrl-C的所有处理.虽然我可能会自己发送一个信号来响应Ctr-C,但我不知道如何让终端向后移动光标(除了输出"返回"并重新写入行的开头).它似乎也给了我不同的键的转义序列,这取决于我是在Xcode的"哑"终端还是在Mac的Terminal.app中运行.
我查看了fishShell 的来源bash,但似乎有很多事情发生,我找不到相关的部分.
标准外壳如何处理接收按键?他们如何处理移动光标和做退格?他们如何在不必接管屏幕的情况下重写部分线路?是否有某个标准可以定义shell需要做什么?
PS - 我知道如何记录以前的命令.它是在键入时实际获得按键,而不是在某人按下返回后,我无法开始工作.
我有一个我工作的存储库.那里有一个文件夹,我把所有想要开源的东西放在一起,所以它与私有部分分开.有没有办法自动获取git将任何提交到该文件夹的内容推送到github存储库,而不必每次都记得将新更改的文件推送到那里?我想将整个存储库推送到另一个github位置.
我创建了一个自定义(主题)NSWindow,创建一个无边框窗口,然后在内容视图中重新创建窗口边框/背景的所有元素.我使用-standardWindowButton:forStyleMask:在我自己的假标题栏上创建了窗口小部件(关闭框,缩放框,最小化框).
麻烦的是,当一张工作表出现在我的自定义窗口之上时(例如"保存更改...",这些按钮不会收到点击.
有谁知道我怎么告诉NSWindow不要拦截我的最小化框中的点击?它适用于标准的NSWindow.当工作表启动时,我仍然可以将它们都发送到扩展坞,或者将窗口缩小.
我想创建一个矢量对象,可以使用数位板绘制,并将从笔中获得压力信息(通过适当增加/减少线宽).现在我知道如何从NSEvent获取压力信息,但当然NSBezierPath不支持变化的线宽.
所以我试图通过计算曲线末端的垂直线并将它们连接到相同的曲线来生成Bezier路径,该路径是我的线的轮廓.它几乎适用于我的小测试项目中的单个曲线段:
https://github.com/uliwitness/WideningBezierPathTest
但是这有一个很大的问题:线路中间只有2个像素(它应该只有32到8).有谁知道我如何调整控制点,使弯曲部分的两条边缘大致相同的距离?

有人有想法吗?建议?有用的文章?
我正在尝试实现一个语法着色文本编辑器,它还可以为您在新行的开头插入空格,或者用文本附件替换文本。
在之前的实现遇到撤消问题后再次仔细阅读文档后,似乎推荐的瓶颈是 NSTextStorageDelegate 的 textStorage(_,willProcessEditing:,range:,changeInLength:) 方法(其中指出Delegates can change the characters or attributes.,而didProcessEditing说我只能更改属性)。这很好用,除了每当我实际更改属性或文本时,文本插入标记都会移动到我修改的任何文本范围的末尾(因此,如果我更改整行的样式,光标将移到行的末尾)。
有谁知道我错过了哪些额外的电话告诉 NSTextStorage/NSTextView 不要搞砸插入标记?此外,一旦我插入文本,我可能不得不告诉它移动插入标记以说明我插入的文本。
注意:我已经看到修改 NSTextStorage 会导致插入点移动到行尾,但是假设我正在继承 NSTextStorage,所以我不能在那里使用解决方案(并且宁愿不继承 NSTextStorage,因为它是一个半-abstract 子类,如果我将其子类化,我将失去 Apple 类的某些行为)。
我正在将一种编程语言移植到 Windows,该语言具有“创建一个窗口”和“在该窗口中创建一个按钮”等命令。编程语言本身是用C++实现的。
我听说 Windows 上最新的、推荐的 UI API 是 WinUI 3,但我确实找不到任何关于如何在代码中定义 GUI 而不是从 XAML 文件加载 GUI 的好信息。
如何用代码创建 WinUI 3 GUI?
我正在使用CoreText在Mac/iOS跨平台代码中绘制一些文本.我可能正在使用操作系统中没有安装真正"Italic"版本的字体供所有用户使用,但是他们需要知道文本是斜体的.
使用AppKit的NSAttributedString -drawAtPoint :,我可以使用NSObliquenessAttributeName使文本倾斜(因此看起来斜体 - 好吧,倾斜).CoreText似乎没有此属性的等效项.至少我在CTStringAttributes.h中找不到任何东西(并不是说在CoreText发布几年之后还有任何文档).
有谁知道如何在iOS上使用CoreText获取倾斜文本?
我正在准备比较三种语言的课程中的第二个示例是处理窗口大小调整事件。它在 Java 和 C# 中的等效项中的工作很简单,但在 Mac Cocoa 框架中,NSWindow resize 事件的委托处理程序永远不会被调用。我添加到头文件
- (void)windowDidResize: (NSNotification *)notification;
Run Code Online (Sandbox Code Playgroud)
和实现文件
- (void)windowDidResize: (NSNotification *)notification
{
NSString *name = notification.name;
NSLog (@"Window was resized, notification %s", name);
}
Run Code Online (Sandbox Code Playgroud)
当我调整窗口大小时,永远不会发出消息。我究竟做错了什么?鼠标事件按其应有的方式工作。[MacBook Pro OSX 10.6.8,Xcode 3.2.6 64 位]。
我正在尝试在C++ 11之上构建一个线程安全层,std::thread其中每个对象都被分配给一个拥有的线程,并且某些调用在错误的线程上使用时会引发硬错误.拥有线程是唯一可以将对象传输到另一个线程的线程.
我已经完成了所有工作,除了thread::id在实际运行之前我找不到获取线程的方法.我需要先将新线程的ID附加到对象上,然后再将其移除.
如果我使用
std::thread newThread( [theObject]()
{
// use theObject here.
} );
Run Code Online (Sandbox Code Playgroud)
我可以获得线程ID的最早点是在线程对象的定义之后,此时线程已经在运行.
我看到有一个默认的构造函数std::thread,但我看不到有办法给它一个函数来在线程上运行.
有没有办法在线程上执行两步构造,或者在创建时控制线程的ID?
当我MyClass在命名空间中有一个 C++ 类时mynamespace,我将它的方法实现为
void mynamespace::MyClass::method() { … }
Run Code Online (Sandbox Code Playgroud)
我可以将其包装在命名空间中以将各个定义缩短为
namespace mynamespace {
void MyClass::method() { ... }
}
Run Code Online (Sandbox Code Playgroud)
有没有办法避免重新输入MyClass::,以便我可以{在签名更改时更轻松地将 之前的所有内容复制到标题作为原型,而不必MyClass::每次都删除?
我想“一个类也是一个命名空间,也许我可以做到”
namespace mynamespace::MyClass {
void method() { ... }
}
Run Code Online (Sandbox Code Playgroud)
但这抱怨我将 MyClass 重新定义为不同的东西。using mynamespace::MyClass;也不起作用(但无论如何都会很糟糕,因为如果它起作用,我将如何在该文件中该行下方的任何位置声明一个独立函数)。
是否有解决方案,或者在 C++ 中根本不可能?
cocoa ×6
c++ ×4
objective-c ×3
appkit ×2
drawing ×2
ios ×2
nswindow ×2
clang ×1
core-text ×1
git ×1
github ×1
italic ×1
macos ×1
namespaces ×1
nsbezierpath ×1
nsbutton ×1
nstextview ×1
nsview ×1
pen-tablet ×1
private ×1
public ×1
stdthread ×1
subdirectory ×1
swift ×1
swift3 ×1
swift5 ×1
themes ×1
unix ×1
warnings ×1
windows ×1
winui-3 ×1