Установка .attributedText для свойств (доступных через выходы внутри загруженного NIB UIView) из внешней ссылки, похоже, не удалась - PullRequest
0 голосов
/ 22 октября 2019

Перо было загружено вручную через 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
    }


    ...

}

1 Ответ

0 голосов
/ 22 октября 2019

Выполнение установщика attributedText, т. Е.

someText.attributedText = someNewAttributedString

триггеров viewDidLayoutSubviews().

Внутри viewDidLayoutSubviews(), я вызывал функцию (например,функция 'load content'), которая также отвечала за установку некоторых строковых атрибутов. Я использовал логический флаг, чтобы гарантировать, что последующие вызовы viewDidLayoutSubviews не будут вызывать эту функцию снова.

В этом случае это логическое условие не работает, как предполагалось, и так далеефункции, которые устанавливают свойство attributedText, приводили к его повторному запуску, перезаписывая изменения, сделанные другими функциями.

Я думал, что имею дело с неясной ошибкой. Я подумал, может быть, это проблема с темой. Я подумал, что, может быть, это какая-то неверная ссылка.

Я подумал неправильно.

Но я надеюсь, что это окажется полезным для кого-то там.

...