简单的NSPageController示例抛出未知的子视图警告并停止工作

时间:2015-09-13 01:30:51

标签: swift cocoa

我试图让一个非常基本的NSPageController工作(在书本模式,而不是历史模式)。它将成功转换一次,然后停止工作。

我怀疑我正在创建NSImageViews我错误加载,但我无法弄清楚如何。

故事板有一个SamplePageController,它保存在最初的硬编码NSImageView中。

我怀疑我在这里遗漏了一些非常明显的东西,因为我发现NSPageController的所有教程都在Objective C中并不是很快,而是倾向于关注历史视图模式。

代码是:

import Cocoa

class SamplePageController: NSPageController, NSPageControllerDelegate {

    private var images = [NSImage]()
    @IBOutlet weak var Image: NSImageView!

    //Gets an object from arranged objects
    func pageController(pageController: NSPageController, identifierForObject object: AnyObject) -> String {
        let image = object as! NSImage
        let image_name = image.name()!
        let temp = arrangedObjects.indexOf({$0.name == image_name})
        return "\(temp!)"
    }

    func pageController(pageController: NSPageController, viewControllerForIdentifier identifier: String) -> NSViewController {
        let controller = NSViewController()
        let imageView = NSImageView(frame: Image.frame)
        let intid = Int(identifier)
        let intid_u = intid!
        imageView.image = images[intid_u]
        imageView.sizeToFit()
        controller.view = imageView
        return controller
        // Does this eventually lose the frame since we're returning the new view and then not storing it and the original ImageView is long gone by then?
        // Alternatively, are we not sizing the imageView appropriately?
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        images.append(NSImage(named:"text")!)
        images.append(NSImage(named:"text-2")!)
        arrangedObjects = images
        delegate = self
    }
}

1 个答案:

答案 0 :(得分:1)

在这种情况下,您的pageController.view设置为window.contentView并触发警告。您需要做的是在window.contentView中添加一个子视图,并将pageController.view指向该点。

警告的原因是,NSPageController创建了内容历史记录的快照(视图),它会将它们添加到与pageController.view相同的级别,以便在它们之间进行转换:这意味着它将会尝试将它们添加到pageController.view.superview

如果您的pageController.view设置为window.contentView,则您要将window.contentView.superview的子视图添加到not supported

  

自WWDC种子以来的新功能:NSWindow从未支持客户将子视图添加到contentView以外的任何内容。

     

某些应用程序会将子视图添加到contentView.superview(也称为窗口的边框视图)。 NSWindow现在会在检测到这种情况时进行记录:" NSWindow警告:添加未知的子视图:"。

     

执行此操作的应用程序需要解决此问题,因为它会阻止10.10上的新功能正常工作。有关官方API,请参阅titlebarAccessoryViewControllers。