swift - 从外部引用设置 .attributedText 属性(可通过 NIB 加载的 UIView 内的 socket 访问)似乎失败

标签 swift nsattributedstring nib

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

将 Nib 连接到 UIView 子类的 socket 已成功初始化并且可以访问。

其中两个 socket 代表 UILabelUITextView - 用于呈现属性文本字符串。

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

相关文章:

html - 仅使用粗体和斜体将 NSAttributedString 转换为 HTML

ios - 以 Xib 作为 Root View 的自定义 View

ios - 从 nib 创建的 UICollectionViewCell 中的奇怪 UIView

swift - 使用 Core Plot 和 Swift 的多个散点图

iOS-图表 : Increasing bar width in grouped sets of BarChartView

iphone - 更改空范围 TextView 的 NSAtributedString 颜色和字体

iphone - 如何在 xib 的 xml 文件的 NSRGB 标签中编码十六进制颜色?

swift - 包含Swift包时如何解决协议(protocol)错误的冗余一致性?

macos - NSPopover 不关闭

ios - 在没有 UIWebView 的 iOS 设备上显示 .RTF 文件 - iOS 上的 initWithRTF?