已通过 UINib(nibName, bundle).instantiate() 手动加载 Nib 。
将 Nib 连接到 UIView
子类的 socket 已成功初始化并且可以访问。
其中两个 socket 代表 UILabel
和 UITextView
- 用于呈现属性文本字符串。
在通过 .attributedText
setter 方法替换之前,正在对可变副本执行对属性字符串的更改。
只要直接在 UIView 子类或加载 Nib 的 View Controller 中调用旨在更新属性文本的函数,一切都会按预期进行。
但是,当通过代码库其他位置的其他类对象中保存的引用调用相同的函数时,不会发生更新。
Nib 的 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
内部,通过对 MyView
对象的引用调用 applySomeStyle
函数可以正常工作。 p>
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.
}
}
但是如果 nib 类对象在其他地方被引用——则不会发生更改。
class SomeOtherViewController: UIViewController
var myVC: MyViewController!
...
func foo() {
myVC.myView.applySomeStyle() // Fails to update the UILabel/UITextView
}
...
}
最佳答案
执行attributedText
setter,即
someText.attributedText = someNewAttributedString
触发viewDidLayoutSubviews()
。
在 viewDidLayoutSubviews()
中,我调用了一个函数(例如“加载内容”函数),该函数还负责设置一些字符串属性。我使用 bool 标志来确保对 viewDidLayoutSubviews
的后续调用不会再次触发该函数。
在这种情况下,该 bool 条件没有按预期工作,因此设置 attributedText
属性的其他函数导致它再次触发,覆盖其他函数所做的更改.
我以为我正在处理一个不起眼的错误。 我想也许是线程问题。 我想这可能是某种损坏的引用。
我想错了。
但我希望这对其他人有用。
关于swift - 从外部引用设置 .attributedText 属性(可通过 NIB 加载的 UIView 内的 socket 访问)似乎失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58496460/