从外部引用的属性上设置.attributedText(可通过NIB加载的UIView中的出口访问)似乎失败

问题描述 投票:0回答:1

笔尖已通过UINib(nibName, bundle).instantiate()手动加载。

将笔尖连接到UIView子类的插座已成功初始化并且可以访问。

这些出口中的两个代表UILabelUITextView-用于显示属性文本字符串。

在通过.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
    }


    ...

}
swift nsattributedstring nib
1个回答
0
投票

执行attributedText设置器,即

someText.attributedText = someNewAttributedString

触发viewDidLayoutSubviews()

viewDidLayoutSubviews()内部,我正在调用一个函数(例如“加载内容”函数),该函数还负责设置一些字符串属性。我使用的是布尔值标志,以确保后续对viewDidLayoutSubviews的调用不会再次触发该函数。

在这种情况下,该布尔条件无法按预期工作,因此设置attributedText属性的其他函数导致该属性再次被触发,从而覆盖了其他函数所做的更改。

我以为我正在处理一个晦涩的错误。我以为这可能是线程问题。我认为这可能是某种残破的参考。

我认为错了。

但是我希望这对外面的人有用。

© www.soinside.com 2019 - 2024. All rights reserved.