Перо было загружено вручную через UINib(nibName, bundle).instantiate()
.
Розетки, соединяющие кончик с подклассом UIView
, успешно инициализированы и доступны.
Два из этих розеток представляютUILabel
и UITextView
- которые используются для представления приписанных текстовых строк.
Изменения в приписанных строках выполняются на изменяемых копиях перед заменой с помощью метода установки .attribtedText
.
Все работает должным образом, когда функции, предназначенные для обновления приписанного текста, вызываются либо непосредственно в подклассе UIView, либо в View Controller, который загружает перо.
Однако, когда та же функция вызывается через сохраненную ссылкувнутри некоторого другого объекта класса в другом месте кодовой базы обновления не происходят.
Подкласс UIView для Nib:
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.
...
}
}
Внутри ViewController
, который загружает Nib, вызовы функции 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.
}
}
Но если на объект класса nib есть ссылка в другом месте - изменения не происходят.
class SomeOtherViewController: UIViewController
var myVC: MyViewController!
...
func foo() {
myVC.myView.applySomeStyle() // Fails to update the UILabel/UITextView
}
...
}