Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 具有静态间距的视图子类_Ios_Swift_Uikit_Subclass - Fatal编程技术网

Ios 具有静态间距的视图子类

Ios 具有静态间距的视图子类,ios,swift,uikit,subclass,Ios,Swift,Uikit,Subclass,我正在创建UIStackView的一个子类,我希望间距是静态的且不可覆盖。我认为这可以通过覆盖间距属性来实现: class MyStackView: UIStackView { override var spacing: CGFloat { get { return 8.0 } set {} } } 然而,这是行不通的。永远不会调用getter,也不会显示间距。我找到的唯一解决方案是以下代码: class MyStackView: UIStack

我正在创建UIStackView的一个子类,我希望间距是静态的且不可覆盖。我认为这可以通过覆盖
间距
属性来实现:

class MyStackView: UIStackView {
    override var spacing: CGFloat {
        get { return 8.0 }
        set {}
    }
}
然而,这是行不通的。永远不会调用getter,也不会显示间距。我找到的唯一解决方案是以下代码:

class MyStackView: UIStackView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        super.spacing = 8.0
    }

    override var spacing: CGFloat {
        get { return 8.0 }
        set {}
    }
}
实际上,我在
get
中返回什么并不重要,它从来没有被任何东西调用过


有人能解释一下这种行为以及如何避免它吗?

在我看来,这里发生了什么。你想要实现两件事:

  • 默认情况下,
    MyStackView
    处的间距应为
    8.0
  • 该间距值不应从外部更改
  • 要实现第一件事,您需要覆盖初始值设定项并在其中设置默认值

    class MyStackView: UIStackView {
    
        private let defaultSpacing: CGFloat = 8.0
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            super.spacing = defaultSpacing
        }
    
        required init(coder: NSCoder) {
            super.init(coder: coder)
            super.spacing = defaultSpacing
        }
    
    }
    
    对于第二件事,您需要覆盖
    间距
    getter
    setter
    ,以获得对来自外部的任何更改的控制

    class MyStackView: UIStackView {
    
        ...
    
        override var spacing: CGFloat {
            get { return defaultSpacing }
            set { print("MyStackView spacing it always \(defaultSpacing)") }
        }
    
    }
    
    为什么不能简单地重写一个变量并得到相同的结果?

    UIStackView.spating
    属性是计算出来的,它不是一个容器。我们可能不在乎原始的
    getter
    是如何工作的,因为我们知道我们的间距总是相同的。我们知道它的值,并且总是可以在重写getter时返回它


    但我们也不知道原始的
    setter
    是如何工作的,以及它在
    UIStackView
    中做了哪些更改。因此,我们不能简单地覆盖
    getter
    。我们必须显式调用
    super.spating=defaultValue
    一次,以触发原始
    setter
    并设置所需的值。

    您能尝试覆盖
    设置吗?除了
    init
    ,如果子类调用
    set
    ,您的覆盖将阻止它们被覆盖,对吗?是的,但在这种情况下,它是一个定制的UI组件,不被设计为被覆盖。所以我只想让间距始终保持在
    8.0
    ,不管怎样。那么,如果您的覆盖,
    set
    ,这不应该起作用吗?因为如果有人试图设置一个不同的值,覆盖set将不会使其生效。但是我确实在上面的代码中覆盖了set(使用
    set{}
    )。也许。。。对于您的第一次尝试,请使用
    set{super.spating=8.0}
    ?感谢您的解释,这种方法似乎是合理的