小编Lyn*_*son的帖子

为什么我的应用程序无法"取消隐藏"(显示)

我正在调查Mac OS X 10.8上的一个问题,我的智慧结束了.我不知道下一步该做什么.

该应用程序是32位,并有一些碳调用.

问题出现了:当我右键单击Dock中的应用程序图标时,选择菜单项"Hide",然后,在应用程序隐藏后,我从Dock中选择"Show"菜单项,出现问题:主文档窗口没有出现(调色板和菜单确实出现).

此时,即使调色板变得可见,"显示"菜单项也不会更改为"隐藏".

当我从应用程序停靠菜单中选择"显示"时,我希望主文档窗口变得可见.就像其他Mac应用程序一样.

当它失败时,如果我使用触控板上的AppExposé手势显示文档窗口并选择主文档窗口,我可以再次显示主文档窗口.

如果我从终端或Xcode启动应用程序,它工作正常.文档窗口显示,我的应用程序的停靠菜单项按预期更改为"隐藏".我通过导航到*.app的父目录并输入来从终端启动应用程序./MyApp.app/Contents/MacOS/MyApp.

通过双击Finder中的应用程序图标启动它时失败.

当应用程序从终端和Xcode启动时,将显示来自应用程序委托的取消隐藏功能的日志消息,但在从Finder启动时则不会出现.

– applicationWillUnhide:
– applicationDidUnhide:
Run Code Online (Sandbox Code Playgroud)

我已经在Console.app中查找了抛出的任何异常(或任何其他消息).没有了.


更新:

为了尝试调试这个,我从Finder启动,并使用Xcode附加到进程.

我怀疑是抛出异常,当我使用Xcode的"Exception Breakpoint"测试它以及在objc_exception_throw(以防万一)上放置一个断点时,当我隐藏或"显示"应用程序时它不会中断.

然后我想我需要证明那个NSApplicationWillUnhideNotification并且NSApplicationDidUnhideNotification被送出去了.它们是我从Xcode或终端启动的,但是如果我从Finder启动,它们就不是.

在将Xcode附加到应用程序之后,通过"添加符号断点"为以下内容添加断点,我验证了这一点:

-[NSNotificationCenter postNotificationName:object:userInfo] 
Run Code Online (Sandbox Code Playgroud)

然后,我添加了一个调试器命令:"po*(id*)($ esp + 12)"以打印出该选择器的第一个参数(通知名称).

这是我在StackOverflow中发布答案中找到的.

使用它,我可以看到在选择"显示"菜单项后发布的通知.当我从Xcode/Terminal启动时,我看到发布了以下通知:

NSApplicationWillUpdateNotification, NSWindowDidUpdateNotification, NSApplicationDidUpdateNotification, ** NSApplicationWillUnhideNotification **, ..., ** NSApplicationDidUnhideNotification **, ..., NSApplicationWillBecomeActiveNotification, ...
Run Code Online (Sandbox Code Playgroud)

NSApplicationWillUnhideNotification 是在这种情况下发布的.

当我从Finder启动时,我看到发布了以下通知:

NSApplicationWillUpdateNotification, NSWindowDidUpdateNotification, NSApplicationDidUpdateNotification, NSApplicationWillBecomeActiveNotification, ...
Run Code Online (Sandbox Code Playgroud)

它没有发送NSApplicationWillUnhideNotification.此外,当我从Xcode推出的版本中选择"显示"时,我会-[NSApplication _doUnhideWithoutActivation]在回溯中看到.当我附加到Finder启动的版本时,为该函数设置断点不会导致我选择"显示"时中断.

然后,我想,也许应用程序认为它没有被隐藏.

我有一个空闲事件处理程序,所以从那里我打印出[[NSApplication sharedApplicaton] isHidden]隐藏和"显示"应用程序时的值.

针对该问题的情况下,不隐藏应用程序时,它打印出NOisHidden.当应用程序被隐藏,它打印出 …

macos cocoa objective-c

8
推荐指数
1
解决办法
1168
查看次数

如何在ui测试时查看应用程序日志记录

在我的Jenkins CI slave上的iOS应用程序上运行UI测试时,UI不正确,我的测试失败.在本地,相同的UI是预期的,测试通过.

我无法解决这个问题,我无法在远程计算机上进行调试.因此,我想添加日志记录以查看应用程序正在做出哪些决定,以找出UI在远程Jenkins从站中错误显示的原因.

测试日志输出不包含来自应用程序(通过NSLog)的日志输出,也无法NSLog在派生数据输出文件夹中的任何.xcactivitylog文件中找到应用程序调用中的任何字符串.

当UI测试运行时,我在哪里可以找到我的应用程序的日志输出?这是使用运行iOS 9.3模拟设备的Xcode 8.2.

ui-testing xctest xcode-ui-testing

8
推荐指数
1
解决办法
1938
查看次数

为什么字符串标识符用于访问资源数据?

我正在开发一个项目来替换已弃用的资源管理系统(Mac和Windows上的QuickTime资源管理器),并且我一直在使用Qt使用的当前模型,其中使用字符串键从资源文件中检索数据.

例如,我的资源文件中可能有一个图像,"HungryBear.png"存储在我的资源文件中.Qt和我提出的系统将以伪代码描述的方式得到它:

image = GetImageResource("BearPlugin/Images/HungryBear.png");
Run Code Online (Sandbox Code Playgroud)

在那一点上很清楚那个图像是什么,以及它可以在哪里找到.

在我们当前的系统中,我们使用数字.数字的问题在于,必须找到资源文件(可能有很多)来找出它是什么图像(或资源).

一个例子:

oldActiveResourceFile = GetActiveResourceFile(); // think of a stack of resource files

SetActiveResourceFile("BearPlugin");

image = GetImageResource(1);

// Perhaps other resources are retrieved and other functions called
// Possibly introduce problems by calling functions that change "Active Resource File"

SetActiveResourceFile(oldActiveResourceFile);
Run Code Online (Sandbox Code Playgroud)

第一种方法是我在访问资源文件数据的当前系统中看到的.我被告知C#和Java使用它,我知道它们用于字符串键值对等.

然而,我的同行已经表示担心改变当前使用这些数字ID的系统,我正在提议的字符串id.似乎有很多好处,它们解决了我们在当前系统中遇到的许多问题.我希望得到支持文档,建议的系统更好,更可取,所以我的问题是:

您是否知道任何研究或讨论证明在代码中使用字符串标识符(分层)比使用任意数字更好?

笔记

  1. 我打算使用zip文件(可能是未压缩的)来包含数据文件.
  2. 我们有一个应用程序插件环境.应用程序和每个插件都可以拥有自己的资源文件.插件可能能够访问应用程序资源文件中的资源数据.
  3. 以下是一些已经考虑过的要求,我相信这些要求:

    • 软件开发人员应能够唯一地识别资源.
    • 软件开发人员应能够使用有意义的名称来命名资源.
    • 资源应与需要它们的应用程序部分相关联.
    • 本地化人员应能够轻松识别已更改的资源文件.
    • 本地化人员应能够使用自己的工具来修改资源文件.
    • 如果客户使用的功能依赖于已弃用的呼叫,则应通知客户.

c# java resources resource-id

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

如何重新布局NSTextView的内容,以便绘制宽度为4个字符的制表符

我正在使用NSTextView,我的一个要求是制表符''t'应具有与四个空格相同的宽度.

所以文本内容看起来像这样:

AAAA
    AAAA - 1 tab
    AAAA - 4 spaces
Run Code Online (Sandbox Code Playgroud)

这就是我实现这个目标的方法:

// done when NSTextView first loaded and when
// delegate's textDidBeginEditing gets called: (perhaps overkill, but is a work in progress).
- (void)updateMyTextViewTextAttributes
{
    NSMutableParagraphStyle* paragraphStyle = [[myTextView defaultParagraphStyle] mutableCopy];
    if (paragraphStyle == nil) {
        paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
    }
    float charWidth = [[myFont screenFontWithRenderingMode:NSFontDefaultRenderingMode] advancementForGlyph:(NSGlyph) ' '].width;
    [paragraphStyle setDefaultTabInterval:(charWidth * 4)];
    [paragraphStyle setTabStops:[NSArray array]];
    [myTextView setDefaultParagraphStyle:paragraphStyle];

    NSMutableDictionary* typingAttributes = [[myTextView typingAttributes] mutableCopy];
    [typingAttributes setObject:paragraphStyle forKey:NSParagraphStyleAttributeName];
    [typingAttributes …
Run Code Online (Sandbox Code Playgroud)

fonts cocoa objective-c appkit

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

是否有类似于Visual Studio的gcc 4.2警告可能会丢失数据?

是否有gcc的标志,从长到短的转换会产生关于可能丢失数据的警告?

我正在开发一个为Visual Studio(2005)和GCC 4.2(适用于Mac OS X)编译的C++应用程序.

Visual Studio打印出来的警告遵循以下模式:

: warning C4244: 'argument' : conversion from 'long' to 'short', possible loss of data
Run Code Online (Sandbox Code Playgroud)

我尝试过-Wconversion,但这并不是我想要的.到目前为止,我唯一能找到的是一个实验性标志,-Wcoercion,它与GCC 4.3相关(我不确定我们是否还想投资).

2009年4月22日美国东部时间11:00编辑:为了澄清,我想看到那个警告.我们有代码,我们想知道何时会发生数据丢失.如果我有代码:

unsigned long value1 = LONG_MAX;
std::cout << "value1: " << value1 << std::endl;

unsigned short value2 = value1;
std::cout << "value2: " << value2 << std::endl;
Run Code Online (Sandbox Code Playgroud)

我得到了这个预期的结果:

  value1:2147483647
  value2:65535

在我们的代码中,我们有特殊的断言来执行强制操作并在执行代码导致数据丢失时发出警告.我们使用Visual Studio的警告在我们的大型代码库中找到了这些位置.

我们有什么方法可以在gcc 4.2中生成这些警告吗?

c++ gcc visual-studio-2005

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

如何以编程方式获取 Mac OS X 保留的快捷键

我正在使用一个应用程序,该应用程序允许客户自定义分配的快捷键。我想做的一件事是警告是否选择了 Mac OS X 已在使用的快捷键。

我正在尝试使用 CopySymbolicHotKeys,但我不确定我是否正确使用它,因为它列出了被保留的命令,即使我没有看到它列在“键盘快捷键”选项卡窗格中& 鼠标”系统偏好设置。我希望能够获得那些“保留”供系统使用的快捷方式,这是要使用的 API 吗?

我在下面包含了我的代码示例,请查看它并提供您可能想到的任何建议。

CFArrayRef hotkeyArray = NULL;
OSStatus status = CopySymbolicHotKeys(&hotkeyArray);

if (noErr == status && NULL != hotkeyArray) {

    CFIndex hotKeyCount = CFArrayGetCount(hotkeyArray);

    for (CFIndex i = 0; i < hotKeyCount; i++) {
        CFDictionaryRef hotKeyDict = (CFDictionaryRef) CFArrayGetValueAtIndex(hotkeyArray, i);
        if (hotKeyDict && CFGetTypeID(hotKeyDict) == CFDictionaryGetTypeID()) {
            if (kCFBooleanTrue == (CFBooleanRef) CFDictionaryGetValue(hotKeyDict, kHISymbolicHotKeyEnabled)) {

                SInt32 keyModifiers = 0;

                CFNumberRef cfkeyModifers = (CFNumberRef) CFDictionaryGetValue(hotKeyDict, kHISymbolicHotKeyModifiers);
                CFNumberGetValue(cfkeyModifers, kCFNumberSInt32Type, &keyModifiers);

                bool keyIsCommandOnly = (keyModifiers == …
Run Code Online (Sandbox Code Playgroud)

macos macos-carbon

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