Пересылка события перетаскивания в родительское представление - PullRequest
2 голосов
/ 25 ноября 2011

У меня есть приложение, в котором у меня есть одно пользовательское представление, которое получено из NSView. В этом представлении есть несколько пользовательских подпредставлений, которые также являются производными от NSView.

Я хочу реализовать поведение перетаскивания, которое позволяет перетаскивать URL-адреса на представления. Все уже работает на основной вид.

Итак, на самом деле мне пришлось бы реализовать обработчики перетаскивания поведения для дочерних представлений и класса родительского представления. Дело в том, что я не хочу копировать полный код обработки во все дочерние представления, чтобы они также принимали события перетаскивания. Поэтому я подумал, что это будет лучший способ просто переслать им все события перетаскивания в родительское представление.

Возможно ли это как-нибудь ?? Не уверен, смогу ли я как-то настроить это с цепочкой респондента, может быть?

Любые советы высоко ценятся! Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 09 января 2012

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

После некоторого исследования я нашел этот ответ длябыть наиболее полезным: https://stackoverflow.com/a/7389711/327471

По существу, если представление не зарегистрировано для получения каких-либо событий перетаскивания, оно должно автоматически передавать эту информацию в родительское представление.Так что в моем случае я получил что-то вроде этого:

NSArray *subviews = [self.view subviews];
for (NSView *aSubview in subviews) {
    [aSubview unregisterDraggedTypes];
}

Конечно, вы можете быть более точным, и убедитесь, что проверяете только подклассы определенного типа или любых параметров, которые вы хотите.Но в конечном итоге ключом была отмена регистрации подпредставления проблемы из его перетаскиваемых типов.

Надеюсь, это поможет.

3 голосов
/ 25 ноября 2011

Если подпредставления используются только для отображения и не требуют взаимодействия с пользователем, вы можете переопределить -hitTest: в родительском представлении следующим образом:

- (NSView *)hitTest:(NSPoint)aPoint
{
    NSView* hitView = [super hitTest:aPoint];
    if(hitView)
        return self;
    return nil;
}

Это позволяет родительскому представлению получать все события мыши.

0 голосов
/ 15 февраля 2019

Все еще работает XCode 10.1. Свифт 4.2. до 10,14,4 бета (18E184e).

// MARK: - ViewController lifecycle

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.subviews.forEach { $0.unregisterDraggedTypes() }
}
0 голосов
/ 09 января 2012

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

...