【问题标题】:Adding a copy of an NSTabViewItem from an NSTabView into the same NSTabView将 NSTabViewItem 的副本从 NSTabView 添加到相同的 NSTabView
【发布时间】:2015-03-14 15:18:09
【问题描述】:

我正在创建一个简单的网络浏览器并希望实现选项卡。为此,我使用了NSTabView。我基本上希望每个选项卡都有一个WebView,它将显示已加载的网站。我只从一个选项卡开始,并希望在创建新选项卡时添加第一个选项卡的精确副本。我尝试了类似tabView.addTabViewItem(tabView.tabViewItemAtIndex(0).copy() as NSTableViewItem) 的东西,但我收到了unrecognised selector sent to instance 错误。我已经查看了 NSTableViewNSTableViewItem 的文档,但不知道该怎么做。

编辑 我的整个错误如下所示:

015-03-14 17:15:57.884 Browser[1955:56547] -[NSTabViewItem copyWithZone:]: unrecognized selector sent to instance 0x600000100b40
2015-03-14 17:15:57.884 Browser[1955:56547] -[NSTabViewItem copyWithZone:]: unrecognized selector sent to instance 0x600000100b40

【问题讨论】:

  • 你能发布更多你的代码吗?特别是 tabView 的初始化位置。此外,如果您可以在错误中粘贴更多堆栈,那也会有所帮助^^
  • @MattyAyOh 我真的没有初始化 tabView 的代码,因为它是使用 Cocoa 构建器完成的,我已将整个错误发布到问题中,希望对您有所帮助。

标签: objective-c cocoa swift nstabview


【解决方案1】:

感谢Copy NSView in cocoa 和@MattyAyOh 的回答,我解决了我的问题:

var data = NSKeyedArchiver.archivedDataWithRootObject(view)
var newView = NSKeyedUnarchiver.unarchiveObjectWithData(data) as NSView
newTab.view = newView
tabView.addTabViewItem(newTab)

【讨论】:

    【解决方案2】:

    所以你得到这个错误是因为你在一个没有实现-copyWithZone 的对象上调用copy()。 (因为 NSTabViewItem 子类 NSView 不符合NSCopying 协议)

    您可以做的就是初始化一个新的NSTabViewItem,然后从第一项 (tabViewItemAtIndex(0)) 中获取属性,然后将它们设置为您的新NSTabViewItem

    来自documentation

    您可以致电setLabelsetIdentifiersetColorsetViewsetTooltip

    初始化并设置新的NSTabViewItem 后,您可以将其添加到您的NSTabView

    NSTabViewItem *tempTabViewItem = [NSTabViewItem new];
    //set your properties on tempTabViewItem here
    tabView.addTabViewItem(tempTabViewItem);
    

    【讨论】:

    • 似乎是个好主意,只是它与使用copy复制选项卡的效果不同,通过使用setView()设置视图,视图指向同一个对象,所以WebViews 不能加载两个不同的网页。
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多