【问题标题】:Creating subclass of NSStackView创建 NSStackView 的子类
【发布时间】:2017-10-23 16:55:10
【问题描述】:

我尝试创建一个子类 os NSStackView,例如给它一个特殊的颜色。

要实例化它,我必须调用一个指定为 init 的超类,如果我理解正确的话。

我如何检测哪些是指定的初始化程序 os NSStackView。查看https://developer.apple.com/documentation/appkit/nsstackview 我发现的唯一初始化程序是:

init(views: [NSView])

但以下代码无法编译为“必须调用超类 'NSStackView' 的指定初始化程序”

class CStackView: NSStackView
{ init(views: [NSView], withColor color: NSColor)
  { super.init(views: views)
    // do something wich the color
  }

  required init?(coder decoder: NSCoder)
  { fatalError("init(coder:) has not been implemented")
  } 
}

init(coder:) 似乎是一个指定的初始化程序,但我想用它的子视图初始化 CStackView,没有编码器。

【问题讨论】:

    标签: swift macos cocoa initialization


    【解决方案1】:

    init(views:) 是一个便利的初始化器。

    NSStackView 没有声明任何指定的初始值设定项,因此它从其超类NSView 继承它们,该超类具有init(frame:)init(coder:)

    您可以让您的初始化程序调用super.init(frame:) 或将您的初始化程序声明为便利初始化程序,然后它可以调用self.init(views:)

    【讨论】:

    • 如果我编写自己的便利初始化程序,我必须调用我自己的类的指定初始化程序,然后必须调用 super.init(frame:) 或 super.init(coder:)。我从来没有机会调用 NSStackViews init(views:)。对吗?
    • 你从哪里知道,init(views:) 是一个方便的初始化器(编译器错误除外)。
    • 如果您编写自己的便利初始化程序,那么只要您的子类没有声明它自己的指定初始化程序,它就可以调用self.{superclass convenience initializer}
    • 你必须点击文档中的函数才能看到它是一个方便的初始化器:developer.apple.com/documentation/appkit/nsstackview/…
    【解决方案2】:

    在@Dan 的帮助下,就是这样。

    class C3StackView: NSStackView
    { convenience init(views: [NSView], withColor color: NSColor)
      { self.init(views: views)  
        // do something wich the color
      }
    
      required convenience init?(coder decoder: NSCoder)
      { fatalError("init(coder:) has not been implemented")
      } 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多