小编Mar*_*k H的帖子

Xcode 8.1的新自动布局错误

标题##我有一个运行得很好的macOS应用程序,直到我升级到Xcode 8.1.

该应用程序打开一个对话框,NSOpenPanel允许用户选择图像.当我选择图像并选择"打开"时,我收到以下错误:

2016-11-03 10:23:25.589283 PA位置数据[9008:265214] [布局]检测到NSTextField的缺失约束:0x6000001e3a00.它无法放置,因为没有足够的约束来完全定义大小和原点.添加缺少的约束,或设置translatesAutoresizingMaskIntoConstraints = YES,并为您生成约束.如果此视图在macOS 10.12及更高版本上手动布局,您可以选择不从覆盖中调用[super layout].在DETECTED_MISSING_CONSTRAINTS上设置断点以进行调试.此错误仅记录一次.

公开对话然后冻结,不能被解雇.

正如所建议的那样,我为DETECTED_MISSING_CONSTRAINTS设置了一个断点,并DETECTED_MISSING_CONSTRAINTS在此代码中发现执行正在暂停:

func happyAlert(message: String, info: String) {
        let myPopup: NSAlert = NSAlert()
        myPopup.messageText = message
        myPopup.informativeText = info
        myPopup.alertStyle = NSAlertStyle.informational
        myPopup.addButton(withTitle: "OK")
        myPopup.runModal()
}
Run Code Online (Sandbox Code Playgroud)

此警报通知用户图像已通过或未通过各种验证检查.

过去发生的事情是图像被选中,被myPopup.runModal()解雇和警报出现没有任何问题.

现在我得到了关于NSTextField的约束的错误,但是我不明白它们为什么会在这里涉及,特别是因为xCode没有标记任何与底层视图的自动布局问题.

任何人都可以解释可能发生的事情和/或进一步调试的策略吗?我的经历有限,我很困惑.

macos cocoa nsalert autolayout swift

27
推荐指数
1
解决办法
2429
查看次数

如何使用Cocoa在Dock图标上绘制徽章?

如何使用Cocoa为我的应用程序的Dock图标添加徽章?有没有大致"标准化"的方法来做到这一点?

(我指的是在Mail,iChat等中显示的那种徽章,用于表示未读消息的数量等.)

Cocoa Touch确实提供了一种这样的方法,但我还没能找到常规Cocoa应用程序的任何等价物.

macos cocoa objective-c badge nsdocktile

25
推荐指数
3
解决办法
7116
查看次数

在小牛队中将CIFilter添加到CALayer?

所以这是向图层添加滤镜的标准方法:

NSView *view = self.window.contentView;
view.wantsLayer = YES;
CATextLayer *textLayer = [CATextLayer layer];
textLayer.frame = CGRectMake(10.0, 10.0, 200.0, 100.0);
textLayer.string = @"foo";
textLayer.foregroundColor = [[NSColor redColor] CGColor];

// Add filter
CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur" keysAndValues:@"inputRadius", @5.0, nil];
textLayer.filters = @[filter];

// Attach layer
[view.layer addSublayer:textLayer];
Run Code Online (Sandbox Code Playgroud)

但是,它在OS X Mavericks上崩溃了我的应用程序.习惯于10.8工作.

2013-10-23 13:09:20.767 Serus[3608:303] *** Terminating app due to uncaught exception 'CAInvalidCIFilter', reason: 'CI filters are not supported by this layer tree: {CIGaussianBlur {
    inputImage = "<null>";
    inputRadius = 10;
}}.'
Run Code Online (Sandbox Code Playgroud)

此层树不支持CI过滤器 …

macos cocoa core-animation calayer cifilter

21
推荐指数
1
解决办法
3370
查看次数

在macOS Catalina上检测屏幕录制设置

检测用户是否已启用此API的可靠方法是什么?

CGWindowListCreateImage即使禁用了屏幕录制API,也将返回有效对象。可能有多种组合(kCGWindowListOptionIncludingWindowkCGWindowListOptionOnScreenBelowWindow),只有一些组合会返回NULL。

- (CGImageRef)createScreenshotImage
{
    NSWindow *window = [[self view] window];
    NSRect rect = [window frame];

    rect.origin.y = NSHeight([[window screen] frame]) - NSMaxY([window frame]);
    CGImageRef screenshot = CGWindowListCreateImage(
                                                    rect,
                                                    kCGWindowListOptionIncludingWindow,
                                                    //kCGWindowListOptionOnScreenBelowWindow,
                                                    0,//(CGWindowID)[window windowNumber],
                                                    kCGWindowImageBoundsIgnoreFraming);//kCGWindowImageDefault
    return screenshot;
}
Run Code Online (Sandbox Code Playgroud)

唯一可靠的方法是CGDisplayStreamCreate冒险,因为Apple每年都会更改隐私设置。

   - (BOOL)canRecordScreen
    {
        if (@available(macOS 10.15, *)) {
            CGDisplayStreamRef stream = CGDisplayStreamCreate(CGMainDisplayID(), 1, 1, kCVPixelFormatType_32BGRA, nil, ^(CGDisplayStreamFrameStatus status, uint64_t displayTime, IOSurfaceRef frameSurface, CGDisplayStreamUpdateRef updateRef) {
                ;
            });
            BOOL canRecord = stream != NULL;
            if (stream) …
Run Code Online (Sandbox Code Playgroud)

macos cocoa screen-recording macos-catalina

13
推荐指数
2
解决办法
3491
查看次数

带有换行符 (%0A) 的 iOS mailto 链接转换为 &lt;BR&gt;

下面的链接最近在邮件应用程序中打开时没有换行。

<a href="mailto:info@example.com?subject=Question&body=%0A%0A%0A----------%0AVersion: 2.0%0ABuild: 12345" id="address">support by email</a>
Run Code Online (Sandbox Code Playgroud)

相反,它在邮件应用程序中显示如下:

<BR><BR><BR>----------<BR>Version: 2.0<BR>Build: 12345
Run Code Online (Sandbox Code Playgroud)

但应该看起来像:

在此处输入图片说明

它适用于 iOS 13,但现在不再适用。我在另一个应用程序和类似的%0A. 使用的时候也会出现%0D%0A

空格被%20javascript编码。

有没有其他人看到过这个或有尝试的想法?

编辑:提交错误报告 FB9146675。请考虑这样做。只有当重点放在一个主题上时,它才会被看到。

email safari newline ios

13
推荐指数
1
解决办法
1126
查看次数

UITableViewAlertForLayoutOutsideViewHierarchy 当 UITableView 没有窗口 iOS13

我开始在 iOS13 上收到警告(如下)。我注意到这个警告弹出是因为UITableView的窗口为空(选择了另一个选项卡,在表选择上推送了详细视图控制器......)。我正在尝试UITableViewNSFetchedResultController委托更新。在 iO13 上执行此操作以保持表更新的正确方法是什么?

下面的代码在以前的版本上运行良好。

PS:任何类型的beginUpdates, reloadRowsAtIndexPaths:withRowAnimation:, insertSections:withRowAnimation:, endUpdates都会导致此警告。

PS:我尝试重新加载表,但如果我向后导航,我会丢失取消选择行的动画(清除行选择)。

2019-09-27 09:40:42.849128+0200 xxx[63595:9762090] [TableView] 仅警告一次:UITableView 被告知在不在视图层次结构(表视图或其其中之一)中布局其可见单元格和其他内容superviews 尚未添加到窗口中)。这可能会通过强制 table view 中的视图在没有准确信息(例如 table view bounds、trait collection、layout margins、safe area insets 等)的情况下加载和执行布局而导致错误,并且还会由于额外的布局传递而导致不必要的性能开销. 在 UITableViewAlertForLayoutOutsideViewHierarchy 处创建一个符号断点,以便在调试器中捕获它并查看导致这种情况发生的原因,因此如果可能,您可以完全避免此操作,或者将其推迟到表视图已添加到窗口中。表视图:层 = ; 内容偏移:{0,-64}; 内容大小:{375, 3432};调整内容插入:{64, 0, 0, 0}; 数据来源:>

// ------------  ------------  ------------  ------------  ------------  ------------
#pragma mark - FetchedResultsController delegate

- (void) controllerWillChangeContent:(NSFetchedResultsController *)controller {
//    if (self.tableView.window) {
        [self.tableView beginUpdates];
//    }
}
- (void) …
Run Code Online (Sandbox Code Playgroud)

uitableview nsfetchedresultscontroller ios ios13

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

如何让NSSearchField在自动完成时发送动作?

这个问题似乎很简单,但我已经尝试了我能想到的一切,并用Google搜索了几个小时.

我有一个自动完成的NSSearchField,基本上复制了Apple的SearchField示例代码.我在IB中关闭了"发送整个搜索字符串",因为我不想在用户完成文本输入之前进行搜索,并且不想进行多次搜索(它们很昂贵).

当用户在字段中键入时,当他们按Enter键,指定他们接受当前的自动完成时,我希望触发NSSearchField的操作.相反,它似乎只是填写自动完成,然后用户必须再次按下输入才能触发操作.基本上,考虑开始在Safari中输入URL,它会自动填充,然后按Enter键开始加载页面(触发操作).他们不需要再次按回车键开始加载页面.

我尝试过的事情没有成功:

  • control:textView:commandSelector:,查找insertNewline:.当他们按Enter键完成自动完成时,它不会被触发
  • 覆盖controlTextDidEndEditing:与上述相同

有任何想法吗?谢谢!

cocoa autocomplete objective-c nstextfield nssearchfield

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

如何在基于NSDocument的Cocoa应用程序中使用NSViewController

我有很多iOS经验,但Cocoa让我有些困惑.我阅读了几篇关于Cocoa的Apple文档,但仍然有一些我在任何地方都找不到的细节.看来文档是在基于NSDocument的Xcode模板更新为使用NSViewController之前编写的,所以我不清楚我应该如何组织我的应用程序.该模板使用NSWindow NSViewController创建一个故事板.

我的理解是我应该将NSWindowController或NSWindow子类化为对我的模型对象的引用,并在makeWindowControllers()中设置它.但是,如果我想使用NSViewController而不是只是将所有内容放在窗口中,我还需要以某种方式访问​​我的模型.我注意到在我的视图控制器中有一个叫做RepresentObject的东西,它似乎意味着要保存一些模型对象(然后被强制转换),但它总是为零.这是如何设置的?

我发现很难正确地提出这个问题,但我想我的问题是:如何在基于文档的应用程序中正确使用NSViewController?

PS:我知道NSWindowController通常用于管理多个窗口,这些窗口作用于一个文档,所以假设我只需要一个窗口,那么我就不需要NSWindowController.但是,要求可能会改变,从长远来看使用NSWindowController可能会更好,对吧?

cocoa nsdocument nsviewcontroller nswindowcontroller xcode-storyboard

6
推荐指数
1
解决办法
4507
查看次数

NSTextfield + NSMenu和第一响应者

我正在尝试实现自己的自动补全系统(结果是从sqlite数据库中提取的)

我已经设置了NSTextField和适当的委托。每当NSTextField中的文本更改时,它都会调用- (void)controlTextDidChange:(NSNotification *)aNotification方法

它工作正常,在这种方法中,我以编程方式构建菜单,最后使用该代码调用/显示了它:

 NSRect frame = [address frame];
NSPoint menuOrigin = [[address superview] convertPoint:NSMakePoint(frame.origin.x, frame.origin.y+frame.size.height-25)
                                                toView:nil];

NSEvent *event =  [NSEvent mouseEventWithType:NSLeftMouseDown
                                     location:menuOrigin
                                modifierFlags:NSLeftMouseDownMask // 0x100
                                    timestamp:0
                                 windowNumber:[[address window] windowNumber]
                                      context:[[address window] graphicsContext]
                                  eventNumber:0
                                   clickCount:1
                                     pressure:1]; 
[NSMenu popUpContextMenu:menu withEvent:event forView:address];
Run Code Online (Sandbox Code Playgroud)

哪里address是我NSTextFieldmenu我的NSMenu。问题在于菜单是焦点所在,因此您只能在文本字段中键入1个字母,然后再也不能键入文本,因为菜单现在是第一响应者。

我的问题是如何显示菜单并保持文本字段为第一响应者,以便您可以在字段中每次更改文本时重新加载菜单时键入文本。

实际上,它应该像在Safari或chrome地址栏中。

cocoa autocomplete objective-c nsmenu nstextfield

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

使用 [NSEvent mouseLocation] 的位置错误

我为 Mac 制作了一个 iPhone 远程鼠标控制器应用程序:iPhone 应用程序将坐标值发送到 Mac,然后 Mac 处理鼠标位置值。

为了获取 Mac 上的当前鼠标位置,接收者调用 [NSEvent mouseLocation]。

x 的值始终正确,但 y 的值错误。

我使用了“while”循环来处理这个事件。

while (1) {
    mouseLoc = [NSEvent mouseLocation];

    while ((msgLength = recv(clientSocket, buffer, sizeof(buffer), 0)) != 0) {
          CGPoint temp;
          temp.x = mouseLoc.x;
          temp.y = mouseLoc.y; // wrong value
          ........
Run Code Online (Sandbox Code Playgroud)

每个循环周期的y值不同。例如,第一次循环时y值为400,下一次循环时y值为500;然后 y 在下一个循环中再次变为 400。

鼠标指针不断地上下移动,两个不同的y值之和始终为900。(我认为是因为屏幕分辨率是1440 * 900。)

我不知道为什么会发生这种情况,该怎么办以及如何调试。

macos cocoa objective-c nsevent ios

5
推荐指数
2
解决办法
2584
查看次数