Не могли бы вы объяснить «приемник» и «просмотр - суперпредставление» в Swift? - PullRequest
0 голосов
/ 04 сентября 2018
override func draw(_ rect: CGRect) {

    let size: CGFloat = 20
    let currencyLbl = UILabel(frame: CGRect(x: 5, y: (frame.size.height/2) - size, width: size, height: size))
    currencyLbl.backgroundColor = #colorLiteral(red: 0.2549019754, green: 0.2745098174, blue: 0.3019607961, alpha: 0.5)
    currencyLbl.textAlignment = .center
    currencyLbl.textColor = #colorLiteral(red: 0.2549019754, green: 0.2745098174, blue: 0.3019607961, alpha: 1)
    currencyLbl.layer.cornerRadius = 5.0
    let formatter = NumberFormatter()
    formatter.numberStyle = .currency
    formatter.locale = .current
    currencyLbl.text = formatter.currencySymbol
    addSubview(currencyLbl)

}

Объяснение addSubview в XCode: «Добавляет представление в конец списка подпредставлений получателя» и говорит: «Этот метод устанавливает строгую ссылку на представление и устанавливает следующий ответчик получателю, который является его новым суперпредставлением»

Не могли бы вы объяснить "приемник" и "представление - суперпредставление" в этом контексте.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

«Получатель» - это возврат ко временам объектива-c, когда «сообщения» отправлялись «объектам». Поэтому мы, старики (хах), обычно звонили [someView addSubview:anotherView] вместо someView.addSubview(anotherView). В этом сценарии «someView» является получателем, потому что он получает сообщение «addSubview».

Представления хранятся в иерархиях, в основном в дереве, где у каждого представления может быть много дочерних (подпредставлений), но только один родительский (суперпредставление). В моем примере «someView» - это супервизор (родительский), в который «другой вид» будет добавлен как подпредставление (дочерний).

В вашем примере класс, который вы реализуете, - это и получатель, и суперпредставление. Это получатель, потому что ваш вызов addSubview неявно "self.addSubview", что означает, что "self" является получателем. Это супер представление, потому что currencyLbl добавляется к нему как подпредставление.

Уточнено для вашего точного случая:

  • Получатель = себя
  • Superview = self
  • View = currencyLbl

(Примечание. Receiver и Superview не являются синонимами, в данном случае они просто ссылаются на один и тот же объект. Это совершенно не связанные понятия.)

0 голосов
/ 04 сентября 2018

В этом примере

let myView = UIView()
parentView.addSubview(myView) // here myView is a subview

parentView называется либо приемник или superView myView

Это

Этот метод устанавливает строгую ссылку для просмотра и устанавливает следующий респондент для получателя, который является его новым суперпредставлением.

означает, что если вы добавили подпредставление в prentView, скажем, в локальной функции, которую подпредставление должно было бы освободить в конце выполнения функции, то addSubview будет содержать сильную ссылку на это подпредставление и предотвратит процесс освобождения

а это

Представления могут иметь только одно суперпредставление. Если представление уже имеет суперпредставление и это представление не является получателем, этот метод удаляет предыдущее суперпредставление перед тем, как сделать получателя его новым суперпредставлением

означает, что если вы добавили myView в parentView1, то это будет единственный супервизор, если вы попытались добавить его в parentView2, он будет автоматически удален из parentView1 и добавлен в parentView2

и это

Добавляет вид в конец списка подвидов получателя.

означает, что это стек подпредставлений, который, когда вы добавляете myView1 в parentView, а затем добавляете myView2, приведут к тому, что myView2 окажется выше myView1s, поэтому он будет активен для любого события и заблокирует его для myView1, если, скажем, оба имеют одинаковый кадр

...