小编Teo*_*ori的帖子

NSSplitViewItem折叠动画和窗口setFrame冲突

我试图在移动其包含的窗口的同时制作一个(新的10.10)NSSplitViewItem崩溃和解体,以便将整个事物保持在"适当的位置".

问题是,我在动画中得到一个抽搐(如看到这里).

我正在进行折叠的代码是这样的:

func togglePanel(panelID: Int) {

     if let splitViewItem = self.splitViewItems[panelID] as? NSSplitViewItem {

          // Toggle the collapsed state
          NSAnimationContext.runAnimationGroup({ context in

               // special case for the left panel
               if panelID == 0 {
                    var windowFrame = self.view.window.frame
                    let panelWidth = splitViewItem.viewController.view.frame.width
                    if splitViewItem.collapsed {
                         windowFrame.origin.x -= panelWidth
                         windowFrame.size.width += panelWidth
                    } else {
                         windowFrame.origin.x += panelWidth
                         windowFrame.size.width -= panelWidth
                    }
                    self.view.window.animator().setFrame(windowFrame, display: true)
               }
               splitViewItem.animator().collapsed = !splitViewItem.collapsed
          }, completionHandler: nil)
     }
}
Run Code Online (Sandbox Code Playgroud)

我知道"不要跨越流"问题(来自会话213,WWDC'13),其中在主线程上运行的窗口大小调整动画和在单独线程上运行的核心动画崩溃动画相互干扰.将splitViewItem折叠动画放到主线程上似乎是错误的方法,我有一种唠叨的感觉,有一个更好的方法来做到这一点,我错过了.

由于我没有在任何地方找到NSSplitViewItems的任何文档(还),我将不胜感激.

我已经在GitHub上的小测试项目在这里 …

multithreading core-animation nssplitview swift

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

NSObject是Hashable但是采用NSObject的协议不是吗?

在我提交雷达之前,只需与社区进行健全检查:

在.h Obj-C文件中:

@protocol myProto <NSObject> 
@end
Run Code Online (Sandbox Code Playgroud)

在.swift文件中(可通过桥接头访问上述协议定义):

class myClass {
    // This line compiles fine
    var dictOne: [NSObject:Int]?
    // This line fails with "Type 'myProto' does not conform to protocol 'Hashable'"
    var dictTwo: [myProto:Int]?
}
Run Code Online (Sandbox Code Playgroud)

NSObject类的检验表明,它(或NSObjectProtocol它映射到)不执行由所述哈希的协议所需的散列值的方法,也没有明确地通过.

所以,在幕后的某个地方,尽管如此,NSObject仍被标记为Hashable,但不会扩展到采用NSObject/NSObjectProtocol的协议.

我有错误或错过了什么吗?

:) Teo

附加信息:

文件表明:

  • 字典的密钥类型的唯一要求是它是Hashable并且它实现了==.
  • 你确实可以使用协议.
字典键类型的哈希值

类型必须是可散列的才能用作字典的键类型 - 也就是说,类型必须提供计算自身散列值的方法.散列值是一个Int值,是对于比较相等的所有对象中,相同的,使得如果一个== B,它遵循a.hashValue == b.hashValue.

所有斯威夫特的基本类型(如字符串,整数,双精度和布尔)的默认情况下可哈希的,而所有这些类型的可以作为一个字典的键.默认情况下,没有关联值的枚举成员值(如枚举中所述)也是可清除的.

注意您可以使用自己的自定义类型作为字典键类型,使其符合Swift标准库中的Hashable协议.符合所述哈希的协议类型必须提供一个gettable int属性称为散列值,并且还必须提供"等于"运算符(==)的实现.类型的hashValue属性返回的值在同一程序的不同执行或不同程序中不需要相同.有关符合协议的更多信息,请参阅协议.

protocols objective-c hashable swift

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