2013-06-21 5 views
3
нажмите список завершения

У меня есть в моем приложении к NSTokenField и я реализовал метод tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:, в котором указанный мной tokenizing характер приемника устанавливается с помощью setTokenizingCharacterSet: метода:NSTokenField пункт

def tokenField(tokenField, completionsForSubstring:substring, indexOfToken:tokenIndex, indexOfSelectedItem:selectedIndex) 
    tokenField.setTokenizingCharacterSet(NSCharacterSet.whitespaceAndNewlineCharacterSet) 
    end 

Он работает, как ожидается, когда я нажимаю на пробел или кнопку ввода. Я также хотел бы иметь такое же поведение, когда я нажимаю на один из элементов списка завершения с помощью мыши.

Как это возможно?

Благодарим за помощь.

ответ

3

Я не знаю, возможно ли иметь это поведение с помощью NSTokenField.

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

Для этого вам придется:

1.Create Xcode проект в качестве статической библиотеки (Не включайте ARC).

2.Save вашего проекта поставщик/MTTokenField

3.Drag и удалить все файлы MTTokenField, расположенные в подкаталоге «MTTokenField» на свой новый проект XCode. Выберите для копирования файлов.

4. Добавьте это в свой файл rakefile, чтобы скомпилировать и связать библиотеку с проектом Rubymotion.

app.vendor_project("vendor/MTTokenField/", :xcode, :xcodeproj => "MTTokenField.xcodeproj", :target => "MTTokenField", :products => ["libMTTokenField.a"], :headers_dir => "MTTokenField") 

5.In Interface Builder изменить класс вашего NSTokenField к NSTextField, а затем установить его собственный класс для MTTokenField, а также изменить пользовательский класс ячейки: MTTokenFieldCell вместо NSTextFieldCell.

6.Then вы должны установить делегат вашего MTTokenField к классу, который должен реагировать на:

def tokenField(tokenField, completionsForSubstring: substring) 
    # your have to return an array containing your results matching substring. 
end 

И это все. Он должен работать.

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

+2

Чувак, ты удивительный! Он отлично работает. – siekfried

1

Я нашел другое решение, используя NSTokenField вместо MTTokenField.

В делегате моего NSTokenField я использовал метод controlTextDidChange для NSControl, который вызывается в любое время, когда я пишу символ в поле маркера. В этом методе я проверяю, есть ли событие NSLeftMouseUp, которое запускается, и если это так, я имитирую клик на Return. Вот и все.

def controlTextDidChange(aNotification) 
    application = NSApplication.sharedApplication 
    event = application.currentEvent 
    if event.type == NSLeftMouseUp 
    e1 = CGEventCreateKeyboardEvent(nil, 0x24, true) 
    CGEventPost(KCGSessionEventTap, e1) 
    end 
end 

Существует еще одна вещь, чтобы сделать, чтобы работать должным образом: проблема здесь в том, что если у меня есть список завершения с 3-х элементов, например, один из них будет выбран по умолчанию, скажем, первый один. В этом случае решение будет работать, как ожидается, если я нажму второй или третий элемент, но мне придется дважды щелкнуть первый элемент, чтобы он работал.

Чтобы исправить это, выключите автозаполнение и отобразите только окно с предложением.е добавить эту строку в tokenField: completionsForSubstring: indexOfToken: indexOfSelectedItem: метод:

selectedIndex[0] = -1 
+0

Любая идея, как это сделать в Swift? – jpgr

Смежные вопросы