【问题标题】:view doesn't get copied视图不会被复制
【发布时间】:2016-07-28 20:48:42
【问题描述】:

我有一个包含一些像这样的对象的视图(绿色区域是我的视图):

每次我按“项目”时,都会将一个新的颜色对象添加到这一行视图中,我希望“行”按钮按原样复制这一行并在按下时将其放置在该行上方,所以我有两个 (或多个)行彼此重叠。我对行按钮进行了这样的操作:

    let hc = contentView1
    hc?.setFrameOrigin(NSPoint(x: 0, y: (positionY*50)))
    positionY += 1

    contentView2?.addSubview(hc!)

但是每次我按下那个按钮时,同一行只会移动而不是复制,就像这样:

我做错了什么?

【问题讨论】:

  • 您可以为项目按钮添加代码吗?
  • 嘿 :) 感谢您的编辑,但您将图像放置在彼此的位置。按钮没有代码,它只是一个 NSButton
  • 我添加了我的 xcode 项目,以便他们可以看到。它现在消失了!!
  • 没关系,我认为你不需要它。您可以添加 contentView1 和 contentView2 所指的内容吗?
  • 看起来问题在于您正在创建一个与您要复制的视图相同的新视图。但是,NSView 是引用类型,而不是值类型。因此,编辑一个视图将编辑另一个视图。

标签: swift cocoa nsview nscoding


【解决方案1】:

一个视图可以有一个超级视图,每次你向一个超级视图添加一个视图时,它都会从之前的超级视图中删除。 NSView 没有实现NSCopying 协议,因此您不能通过调用copy 来复制视图。搜索“复制 NSView”。

【讨论】:

    【解决方案2】:

    看起来问题在于您正在创建一个与您要复制的视图相同的新视图。但是,NSView 是引用类型,而不是值类型。因此,编辑一个视图将编辑另一个视图。

    NSView 幸运地实现了NSCoding 协议,因此您可以像这样复制视图:

    let archivedView = NSKeyedArchiver.archivedDataWithRootObject(contentView1)
    let hc = NSKeyedUnarchiver.unarchiveObjectWithData(archivedView)
    

    然后做剩下的:

    hc?.setFrameOrigin(NSPoint(x: 0, y: (positionY*50)))
    positionY += 1
    contentView2?.addSubview(hc!)
    

    【讨论】:

    • unarchiveObjectWithData 给出错误use of unresolved identifier
    • 仔细检查代码。我忘了包括NSKeyedArchiver。
    • 是的,这次它给出了错误:类型'NSKeyedArchiver'没有成员'unarchiveObjectWithData'
    • 现在我得到了我的行,但它们是空的:screenshot
    • blocks不是contentView1的子视图吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多