私有变量值在 ios swift 中的 CustomView 中
Private variables value is resting in CustomView in ios swift
我正在尝试使用 xib 创建一个 customView 下面是代码
import UIKit
class CustomView: UIView {
@IBOutlet var CustomView: UIView!
private var _isSelecteda:Bool!
var isSelecteda: Bool {
get {
return _isSelecteda
}
set {
_isSelecteda = isSelecteda
if _isSelecteda {
CustomView.backgroundColor = UIColor.white
CustomView.layer.borderColor = UIColor.black.cgColor
}
else {
CustomView.backgroundColor = Colors.searchGameCellBackgroundColor
CustomView.layer.borderColor = Colors.priceLabelBorderColor?.cgColor
}
}
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
private func commonInit() {
Bundle.main.loadNibNamed("CustomView", owner: self, options: nil)
addSubview(CustomView)
self._isSelecteda = false
CustomView.layer.cornerRadius = 3
CustomView.layer.borderWidth = 1
self.clipsToBounds = true
CustomView.frame = self.bounds
}
@IBAction func btnSelectedTapped(_ sender: Any) {
isSelecteda = !isSelecteda
}
}
每当我尝试访问 isSelecteda 时,都会调用 _isSelecteda 的私有声明并重置值。我的 objective 是从 ViewController 中设置 isSelected 的值并更改其背景颜色。
按照我的理解应该不是这样的。很奇怪
注意:我正在使用 Xcode 9.4.1 和 Swift 4.1
为什么不使用 didSet
?
didSet {
if isSelecteda {
CustomView.backgroundColor = UIColor.white
CustomView.layer.borderColor = UIColor.black.cgColor
} else {
CustomView.backgroundColor = Colors.searchGameCellBackgroundColor
CustomView.layer.borderColor = Colors.priceLabelBorderColor?.cgColor
}
}
你的值是 reset 的原因可能是因为你的变量仍然有你在 setter 中用于比较的 oldValue
。当您在 setter 中调用变量时,getter 会得到 oldValue
,因为 newValue
尚未设置。
注意:最好遵循官方命名规则guidelines。变量是 小驼峰式 。 CustomView
-> customView
.
根据我的理解,您应该像这样更改 setter:
set {
_isSelecteda = newValue
if _isSelecteda {
CustomView.backgroundColor = UIColor.white
CustomView.layer.borderColor = UIColor.black.cgColor
}
else {
CustomView.backgroundColor = Colors.searchGameCellBackgroundColor
CustomView.layer.borderColor = Colors.priceLabelBorderColor?.cgColor
}
}
newValue 变量是调用 setter 时收到的实际值。
你什么时候会这样做:
customView.isSelecteda = false
setter 在 newValue 变量中得到 'false'。您将此值设置为您的私有变量,并根据此值执行后续功能。
您可以在这个问题中找到更多关于 'oldValue' 和 'newValue' 的信息:
Click Here
编辑:关于这是正确行为的理由:
get {
return _isSelecteda // false - from init call
}
set {
_isSelecteda = isSelecteda // isSelecteda getter called from above returning false, newValue is neglected
if _isSelecteda { // returns false
CustomView.backgroundColor = UIColor.white
CustomView.layer.borderColor = UIColor.black.cgColor
}
else {
CustomView.backgroundColor = Colors.searchGameCellBackgroundColor
CustomView.layer.borderColor = Colors.priceLabelBorderColor?.cgColor
}
}
我正在尝试使用 xib 创建一个 customView 下面是代码
import UIKit
class CustomView: UIView {
@IBOutlet var CustomView: UIView!
private var _isSelecteda:Bool!
var isSelecteda: Bool {
get {
return _isSelecteda
}
set {
_isSelecteda = isSelecteda
if _isSelecteda {
CustomView.backgroundColor = UIColor.white
CustomView.layer.borderColor = UIColor.black.cgColor
}
else {
CustomView.backgroundColor = Colors.searchGameCellBackgroundColor
CustomView.layer.borderColor = Colors.priceLabelBorderColor?.cgColor
}
}
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
private func commonInit() {
Bundle.main.loadNibNamed("CustomView", owner: self, options: nil)
addSubview(CustomView)
self._isSelecteda = false
CustomView.layer.cornerRadius = 3
CustomView.layer.borderWidth = 1
self.clipsToBounds = true
CustomView.frame = self.bounds
}
@IBAction func btnSelectedTapped(_ sender: Any) {
isSelecteda = !isSelecteda
}
}
每当我尝试访问 isSelecteda 时,都会调用 _isSelecteda 的私有声明并重置值。我的 objective 是从 ViewController 中设置 isSelected 的值并更改其背景颜色。
按照我的理解应该不是这样的。很奇怪
注意:我正在使用 Xcode 9.4.1 和 Swift 4.1
为什么不使用 didSet
?
didSet {
if isSelecteda {
CustomView.backgroundColor = UIColor.white
CustomView.layer.borderColor = UIColor.black.cgColor
} else {
CustomView.backgroundColor = Colors.searchGameCellBackgroundColor
CustomView.layer.borderColor = Colors.priceLabelBorderColor?.cgColor
}
}
你的值是 reset 的原因可能是因为你的变量仍然有你在 setter 中用于比较的 oldValue
。当您在 setter 中调用变量时,getter 会得到 oldValue
,因为 newValue
尚未设置。
注意:最好遵循官方命名规则guidelines。变量是 小驼峰式 。 CustomView
-> customView
.
根据我的理解,您应该像这样更改 setter:
set {
_isSelecteda = newValue
if _isSelecteda {
CustomView.backgroundColor = UIColor.white
CustomView.layer.borderColor = UIColor.black.cgColor
}
else {
CustomView.backgroundColor = Colors.searchGameCellBackgroundColor
CustomView.layer.borderColor = Colors.priceLabelBorderColor?.cgColor
}
}
newValue 变量是调用 setter 时收到的实际值。
你什么时候会这样做:
customView.isSelecteda = false
setter 在 newValue 变量中得到 'false'。您将此值设置为您的私有变量,并根据此值执行后续功能。
您可以在这个问题中找到更多关于 'oldValue' 和 'newValue' 的信息: Click Here
编辑:关于这是正确行为的理由:
get {
return _isSelecteda // false - from init call
}
set {
_isSelecteda = isSelecteda // isSelecteda getter called from above returning false, newValue is neglected
if _isSelecteda { // returns false
CustomView.backgroundColor = UIColor.white
CustomView.layer.borderColor = UIColor.black.cgColor
}
else {
CustomView.backgroundColor = Colors.searchGameCellBackgroundColor
CustomView.layer.borderColor = Colors.priceLabelBorderColor?.cgColor
}
}