Спросите NSSlider, если у пользователя все еще нажата кнопка мыши? (быстрый)

Привет, я реализую подкласс NSSlider и NSSliderCell в swift, я хотел бы проверить/получить свойство _scFlags.isPressed из NSSliderCell, я обнаружил, что в Objective-C есть «хак», чтобы сделать это при вызове из другого класса (что на самом деле не нужно, если вы подкласс NSSlider в Objective-C):

http://www.cocoabuilder.com/archive/cocoa/54913-nsslider.html

Однако в Swift, когда я ищу в API (AppKit -> NSSliderCell), я могу найти структуру, которая, как я полагаю, мне нужна, и ничего, кроме init() внутри:

public struct __sliderCellFlags {
    public init()
}

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

self.__sliderCellFlags 
self._scFlags
super.__sliderCellFlags
super._scFlags

Я что-то пропустил? Есть ли другой способ назвать эти свойства?


person gbdavid    schedule 17.09.2015    source источник


Ответы (1)


Используйте Objective-C для реализации категории в NSSliderCell, которая имеет свойство для доступа к данным структуры и использования свойства из Swift.

NSSlider+FlagsAccessor.h

@interface NSSlider (FlagsAccessor)

@property (nonatomic, readonly) BOOL isPressed;

@end

NSSlider+FlagsAccessor.m

#import "NSSlider+FlagsAccessor.h"

@interface NSSliderCell (FlagsAccessor)

@property (nonatomic, readonly) BOOL isPressed;

@end

@implementation NSSlider (FlagsAccessor)

- (BOOL)isPressed
{
    NSSliderCell *cell = self.cell;

    return cell.isPressed;
}

@end

@implementation NSSliderCell (FlagsAccessor)

- (BOOL)isPressed
{
    return self->_scFlags.isPressed == 1;
}

@end

Затем, чтобы использовать его из Swift, просто вызовите self.isPressed. Вот пример проекта.

Не забудьте импортировать заголовок категории в заголовок-мост (Xcode предложит вам создать заголовок-мост при добавлении кода Objective-C в проект Swift).

person Guilherme Rambo    schedule 20.09.2015
comment
Это здорово, это будет работать для меня как хороший обходной путь, пока они не сделают что-то с этим в быстром API, спасибо! Последний вопрос. Если бы я добавил IBOutlet в ваш пример проекта для слабой переменной @IBOutlet sliderCell: NSSliderCell! и одно действие для доступа к его свойству .isPressed, например: sliderCell.isPressed, что я должен добавить в класс target-C, чтобы разрешить это? на данный момент не получается сделать, slider.cell.isPressed тоже не могу - person gbdavid; 20.09.2015
comment
Это на самом деле странно, я вижу, что вы не должны ничего делать с этим, нужно просто взять его... когда я вижу ошибку, я щелкаю правой кнопкой мыши по свойству isPressed и перехожу к определению, он просит меня выбрать правильное место из варианты, может быть ошибка в Xcode? - person gbdavid; 20.09.2015
comment
Зачем вам slider.cell.isPressed? Просто используйте slider.isPressed (который за кулисами просто вызывает self.cell.isPressed, посмотрите на реализацию). - person Guilherme Rambo; 20.09.2015