笔尖已通过UINib(nibName, bundle).instantiate()
手动加载。
将笔尖连接到UIView
子类的插座已成功初始化并且可以访问。
这些出口中的两个代表UILabel
和UITextView
-用于显示属性文本字符串。
在通过.attribtedText
设置方法替换之前,正在对可变副本进行属性字符串的更改。
只要在UIView子类或加载笔尖的View Controller中直接调用用于更新属性文本的功能,一切都会按预期进行。
但是,当通过保留在代码库中其他地方其他类对象中的引用调用同一函数时,不会发生更新。
笔尖的UIView子类:
class MyView: UIView {
@IBOutlet weak var aLabel: UILabel!
@IBOutlet weak var someText: UITextView!
...
public func applySomeStyle() {
guard
let aLabelMAS = aLabel.attributedText?.mutableCopy() as? NSMutableAttributedString,
var someTextMAS = someText.attributedText.mutableCopy() as? NSMutableAttributedString
else {
return
}
let labelRange = NSRange(location: 0, length: aLabelMAS.length)
aLabelMAS.addAttribute(.backgroundColor, value: UIColor.yellow, range: labelRange)
let someTextRange = NSRange(location: 0, length: someTextMAS.length)
someTextMAS.removeAttribute(.backgroundColor, range: someTextRange)
aLabel.attributedText = aLabelMAS
someText.attributedText = someTextMAS
}
public func doStuff() {
...
applySomeStyle() // No problems -- the attributed strings inside the UILabel and UITextView are updated as intended.
...
}
}
从加载Nib的ViewController
内部,通过对applySomeStyle
对象的引用对MyView
函数的调用工作正常。
class MyViewController: UIViewController {
weak var myView: MyView!
override func viewDidLoad() {
super.viewDidLoad()
...
myView = UINib(nibName: "MyView", bundle: Bundle.main).instantiate(
withOwner: self, options: nil).first as? MyView
self.view.addSubview(myView)
...
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
myView.applySomeStyle() // Again, no problems.
}
}
但是如果在其他地方引用了笔尖类对象,则不会发生更改。
class SomeOtherViewController: UIViewController
var myVC: MyViewController!
...
func foo() {
myVC.myView.applySomeStyle() // Fails to update the UILabel/UITextView
}
...
}
执行attributedText
设置器,即
someText.attributedText = someNewAttributedString
触发viewDidLayoutSubviews()
。
在viewDidLayoutSubviews()
内部,我正在调用一个函数(例如“加载内容”函数),该函数还负责设置一些字符串属性。我使用的是布尔值标志,以确保后续对viewDidLayoutSubviews
的调用不会再次触发该函数。
在这种情况下,该布尔条件无法按预期工作,因此设置attributedText
属性的其他函数导致该属性再次被触发,从而覆盖了其他函数所做的更改。
我以为我正在处理一个晦涩的错误。我以为这可能是线程问题。我认为这可能是某种残破的参考。
我认为错了。
但是我希望这对外面的人有用。