UITextView
или его делегат не имеет API shouldReplaceCharacters
, насколько я знаю (и я не нахожу ничего полезного, по крайней мере, для iOS - он существует для macOS, хотя )
Если я подкласс UITextView
, я могу переопределить insertText
и определить истинную точку вставки:
class TestTextView : UITextView {
override func insertText(_ text: String) {
let selectedRange = self.selectedRange
if let markedRange = self.markedTextRange {
Swift.print("TestTextView inserting \(text) at \(selectedRange.location) & \(selectedRange.length) ; marked = \(markedRange.start) & \(markedRange.end)")
} else {
Swift.print("TestTextView inserting \(text) at \(selectedRange.location) & \(selectedRange.length) and no marked range")
}
super.insertText(text)
}
}
Когда я добавлю этот подкласс TestTextView
в тестовый проект и включите клавиатуру VN. Вот что я вижу для uw
, набранного в:
TestTextView inserting u at 17 & 0 and no marked range
TestTextView inserting ư at 17 & 0 and no marked range
в то время как «e» & amp; Набранный последовательно «b» выглядит следующим образом:
TestTextView inserting e at 17 & 0 and no marked range
TestTextView inserting b at 18 & 0 and no marked range
Наконец, мой ответ довольно прост, и вам может понадобиться [1111 ] отслеживать «помеченный диапазон текста», который вступает в игру с этим многоступенчатым вводом текста .
Глава 11 (В Деревьях выражений) и глава 12 (Расширяющий Linq) Программирования Microsoft Linq (ISBN 13: 978-0-7356-2400-9 или ISBN 10: 0-7356-2400-3), было неоценимо для меня. Я не прочитал книгу Жонса, но он - качественный парень и объясняет вещи хорошо, таким образом, я предполагаю, что его покрытие также было бы хорошо.
Другой большой ресурс является блогом Де-Смета Bart
Кроме того, бдительно следите за MSDN, пример кода для создания Простого Linq к Базе данных (Pedram Rezaei) собирается получить приблизительно 40 страниц Doco, объясняя это.
Действительно, действительно полезный ресурс для Дерева выражений на самом деле я расценил бы его, поскольку необходимая вещь является Деревом выражений средство отладки Visualiser.
Необходимо также изучить столько, сколько Вы можете о Посетителях Дерева выражений, здесь существует довольно хорошая реализация базового класса.
Вот некоторый пример кода, полученный из того класса Посетителя, чтобы сделать некоторую отладку (я основывал это на некотором примере кода в книге, которую я упомянул), prependIndent вызов метода является просто дополнительным методом на строке для помещения "-" в каждый уровень отступа.
internal class DebugDisplayTree : ExpressionVisitor
{
private int indentLevel = 0;
protected override System.Linq.Expressions.Expression Visit(Expression exp)
{
if (exp != null)
{
Trace.WriteLine(string.Format("{0} : {1} ", exp.NodeType, exp.GetType().ToString()).PrependIndent(indentLevel));
}
indentLevel++;
Expression result = base.Visit(exp);
indentLevel--;
return result;
}
...
Я не утверждаю их быть всесторонним, но у меня есть много Expression
размещает в моем блоге. Если Вы будете британские базирующийся, то я буду также представлять сессию на Expression
в DDD на юго-запад в мае (и вчера вечером, но слишком поздно;-p). Я мог отправить деку слайда и некоторые ссылки из похожих статей, если Вы хотите..., к сожалению, pptx намеревался говориться, редко делает разумное автономное чтение.
Некоторое другое чтение (не из блога):
Expression
Expression
Expression
как Компилятор(и целая загрузка сообщений здесь и на microsoft.public.dotnet.languages.csharp - пытается искать: +expression-regex - "регулярное выражение"
Изучите Схему. Выражения используют те же принципы в качестве лямбда-исчисления и следовательно дадут Вам некоторое лучшее понимание.
С другой стороны, можно посмотреть на ДОЛЛАР, который является подобным, но намного менее изящным.