Подтвердить что ты не робот

Вызов `print` внутри NSView открывает диалог печати

Это странно. У меня есть простой компоновщик раскадровки с GridView для атрибута имени класса.

class GridView: NSView {

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        print("coder: \(coder)")
    }

    override func drawRect(dirtyRect: NSRect) {
        let rect = NSBezierPath(rect: dirtyRect)
        NSColor.redColor().setFill()
        rect.fill()
    }
}

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

Print dialog

Почему это происходит и как я могу правильно переопределить инициализатор раскадровки для пользовательского представления?

4b9b3361

Ответ 1

Вызов print() делает что-то другое по своему усмотрению - точнее: что-то другое, как вы ожидали. Он вызывает NSView print(sender: AnyObject?) вместо печати журнала. Вы можете рассматривать это как ошибку или, по крайней мере, как совершенно неожиданное поведение, поскольку Swift.print(...) обычно гораздо более используется.

Этот метод действий открывает панель "Печать", и если пользователь выбирает вариант, отличный от отмены, выводит ресивер и все его дочерние объекты на устройство, указанное на панели "Печать".

Взгляните на этот пост в форуме apple dev.

На самом деле это не ошибка, поскольку вызов print, который является "ближе" в текущем контексте, безусловно, правильный. Вызов родительского print намного более разумен, чем вызов некоторого произвольного другого print. Только тот факт, что вы обычно используете другой отпечаток, здесь путают, так как в целом вы не беспокоитесь о том, в какой области находится журнал print - он просто работает. Если вы считаете, что все наоборот, и хотите использовать печать print вашего родителя, это будет лот более запутанным, чтобы явно указать, что вы хотите использовать родителей print, а не Swift.print(...).

Единственное "решение" - использовать разные имена для двух функций, которые, вероятно, не произойдут.

Ответ 2

Причина, по которой он вызывает диалог печати, состоит в том, что Swift 2, по-видимому, имеет два метода с одинаковой сигнатурой.

enter image description here

Ответ 3

Это довольно старый поток, но я должен добавить здесь, что вы можете написать:

Swift.print("something")

и вы будете использовать функцию "log print", а не просматривать ее.