Я делаю приложение, которое использует UITextView
. Теперь я хочу, чтобы в текстовом представлении был заполнитель, похожий на тот, который вы можете установить для текстового поля. Как бы вы достигли этого с помощью Swift?
ios
swift
uitextview
placeholder
StevenR
источник
источник
Ответы:
Обновлено для Swift 4
UITextView
по сути не имеет свойства заполнителя, поэтому вам придется создавать и манипулировать им программно с помощьюUITextViewDelegate
методов. Я рекомендую использовать решение № 1 или № 2 ниже в зависимости от желаемого поведения.Примечание. Для любого решения добавьте
UITextViewDelegate
в класс и установитеtextView.delegate = self
методы делегата текстового представления.Решение № 1 - Если вы хотите, чтобы заполнитель исчез, как только пользователь выберет текстовое представление:
Сначала установите в
UITextView
качестве текста-заполнителя и установите его в светло-серый цвет, чтобы имитировать внешний видUITextField
текста-заполнителя. Либо сделайте это вviewDidLoad
или при создании текстового представления.Затем, когда пользователь начинает редактировать текстовое представление, если текстовое представление содержит заполнитель (то есть, если его цвет текста является светло-серым), очистите текст заполнителя и установите цвет текста на черный, чтобы приспособить запись пользователя.
Затем, когда пользователь заканчивает редактирование текстового представления и он уходит в отставку как первый респондент, если текстовое представление пусто, сбросьте его заполнитель, повторно добавив текст заполнителя и установив его цвет на светло-серый.
Решение № 2 - Если вы хотите, чтобы заполнитель отображался всякий раз, когда текстовое представление пусто, даже если текстовое представление выбрано:
Сначала установите заполнитель в
viewDidLoad
:(Примечание. Поскольку OP хотел, чтобы текстовое представление выбиралось сразу после загрузки представления, я включил выделение текстового представления в вышеприведенный код. Если это не ваше желаемое поведение и вы не хотите, чтобы текстовое представление выбиралось при загрузке представления, удалите две последние строки из указанного выше фрагмента кода.)
Затем используйте
shouldChangeTextInRange
UITextViewDelegate
метод, например так:А также реализовать,
textViewDidChangeSelection
чтобы пользователь не мог изменить положение курсора, пока заполнитель не виден. (Примечание:textViewDidChangeSelection
вызывается до загрузки вида, поэтому проверяйте цвет текста только в том случае, если окно видно):источник
yourTextField.delegate = self
. Если вы не сделаете этого,textViewDidBeginEditing
иtextViewDidEndEditing
функции не будут работать.Cannot convert value of type 'NSRange' (aka '_NSRange') to expected argument type 'Range<String.Index>' (aka 'Range<String.CharacterView.Index>')
.let currentText = textView.text as NSString?
. Преобразуйтеlet updatedText =
строку вlet updatedText = currentText?.replacingCharacters(in: range, with: text)
. Наконец, преобразуйтеif updatedText.isEmpty
строку вif (updatedText?.isEmpty)! {
. Это должно делать свое дело!textView.selectedTextRange
изнутриfunc textViewDidChangeSelection(_ textView: UITextView)
вызывает бесконечный цикл ...Плавающий Заполнитель
Это просто, безопасно и надежно расположить метку-заполнитель над текстовым представлением, установить его шрифт, цвет и управлять видимостью-заполнителем, отслеживая изменения количества символов в текстовом представлении.
Свифт 3:
Swift 2: То же самое, за исключением:
italicSystemFontOfSize(textView.font.pointSize)
,UIColor.lightGrayColor
источник
Настоятельно рекомендуем использовать библиотеку KMPlaceholderTextView . Очень прост в использовании.
источник
Swift:
Добавьте текстовое представление программно или через Интерфейсный Разработчик, если последнее, создайте выход:
Пожалуйста, добавьте делегата (UITextViewDelegate):
В методе viewDidLoad добавьте следующее:
Теперь позвольте мне представить магическую часть, добавив эту функцию:
Обратите внимание, что это будет выполняться всякий раз, когда начинается редактирование, там мы проверим условия, чтобы сообщить состояние, используя свойство color. Задавать текст
nil
я не рекомендую. Сразу после этого мы устанавливаем желаемый цвет текста, в данном случае черный.Теперь добавьте эту функцию тоже:
Позвольте мне настаивать, не сравнить с
nil
, я уже попробовал это, и это не будет работать. Затем мы устанавливаем значения обратно в стиль заполнителя и устанавливаем цвет обратно в цвет заполнителя, потому что это условие для регистрацииtextViewDidBeginEditing
.источник
Используйте это расширение, это лучший способ установить заполнитель в UITextView. Но убедитесь, что вы прикрепили делегатов к TextView. Вы можете установить Placeholder следующим образом: -
источник
Я удивлен, что никто не упомянул
NSTextStorageDelegate
.UITextViewDelegate
Методы будут вызваны только взаимодействием с пользователем, но не программно. Например, когда вы устанавливаетеtext
свойство текстового представления программно, вам придется самостоятельно устанавливать видимость заполнителя, потому что методы делегата не будут вызываться.Однако,
NSTextStorageDelegate
«StextStorage(_:didProcessEditing:range:changeInLength:)
метод, вы будете уведомлены о любых изменениях в тексте, даже если это делается программно. Просто назначьте это так:(В
UITextView
этом свойстве делегата используетсяnil
по умолчанию, поэтому оно не влияет на поведение по умолчанию.)Объедините его с
UILabel
техникой @clearlight демонстрирует, можно легко обернуть всюUITextView
«splaceholder
реализации в расширение.Обратите внимание, что использование закрытого (вложенного) класса называется
PlaceholderLabel
. У него вообще нет реализации, но он дает нам способ идентифицировать метку-заполнитель, которая гораздо более «быстрая», чем использованиеtag
свойства.При таком подходе вы все равно можете назначить делегата
UITextView
кому-либо еще.Вам даже не нужно менять классы ваших текстовых представлений. Просто добавьте расширение (я), и вы сможете назначить строку-заполнитель каждому
UITextView
в вашем проекте, даже в Интерфейсном Разработчике.Я упустил реализацию
placeholderColor
свойства для ясности, но оно может быть реализовано всего за несколько строк с аналогичной вычисляемой переменнойplaceholder
.источник
textView.textStorage.delegate = self
это в контроллере представления потребует, чтобы мы связали тот контроллер представления сNSTextStorageDelegate
. Это действительно требует?NSTextStorageDelegate
, а не контроллер представления.Я сделал это с помощью двух разных текстовых представлений:
Идея состоит в том, что, как только пользователь начинает набирать текст на переднем плане, заполнитель на заднем плане исчезает (и появляется снова, если пользователь удаляет все). Таким образом, он ведет себя как заполнитель для однострочного текстового поля.
Вот код, который я использовал для этого. Обратите внимание, что descriptionField - это поле, которое вводит пользователь, а descriptionPlaceholder - это поле в фоновом режиме.
источник
Основываясь на некоторых замечательных предложениях, я смог собрать следующий легкий подкласс, совместимый с Interface-Builder
UITextView
, который:UITextField
.text
свойство поля .Любые предложения по улучшению приветствуются, особенно если есть какой-либо способ получить цвет заполнителя iOS программно, а не жестко программировать его.
Swift v5:
источник
УСТАНОВИТЬ значение в представлении нагрузки
источник
Я пытался сделать код удобным из Clearlight «s ответа .
использование
источник
Еще одно решение (Swift 3):
результат
источник
Простое и быстрое решение, которое работает для меня:
источник
Вот что я использую для этой работы.
Я знаю, что есть несколько подходов, подобных этому, но преимущества этого:
источник
Swift 3.2
Сначала, когда пользователь начинает редактировать вызов textViewDidBeginEditing, а затем проверяет, означает ли цвет текста серый, означает, что пользователь ничего не писал, тогда установите значение textview nil и измените цвет на черный для текстовых сообщений пользователя.
Когда пользователь завершает редактирование textViewDidEndEditing, вызывается и проверяется, не пишет ли пользователь ничего в textview, тогда текст устанавливается серым цветом с текстом «PlaceHolder»
источник
Вот мой способ решения этой проблемы ( Swift 4 ):
Идея заключалась в том, чтобы сделать самое простое из возможных решений, которое позволяет использовать заполнители разных цветов, изменять размеры до размера заполнителей, не перезаписывая при
delegate
этом всеUITextView
функции, работающие должным образом.источник
Я не знаю, почему люди слишком усложняют эту проблему ... Это довольно просто и понятно. Вот подкласс UITextView, который обеспечивает запрошенную функциональность.
источник
Это мое готовое решение, если вы работаете с несколькими текстовыми представлениями.
источник
Swift 3.1
Это расширение хорошо сработало для меня: https://github.com/devxoul/UITextView-Placeholder
Вот фрагмент кода:
Установите его через модуль:
Импортируйте его в свой класс
И добавьте
placeholder
свойство к уже созданномуUITextView
Вот так ... Вот как это выглядит (Третья коробка
UITextView
)источник
В отличие от почти каждый ответ на этот пост,
UITextView
делает имеют свойство заполнитель. По причинам вне моего понимания, это раскрывается только в IB, как таковой:Поэтому, если вы используете раскадровки и статического заполнителя будет достаточно, просто установите свойство в инспекторе.
Вы также можете установить это свойство в коде так:
Его мутный , как к погоде это доступ через частный API, как свойство является подвергается.
Я не пытался отправить с этим методом. Но я отправлю этот способ в ближайшее время и обновлю этот ответ соответственно.
ОБНОВИТЬ:
Я отправил этот код в нескольких выпусках без проблем от Apple.
ОБНОВЛЕНИЕ: Это будет работать только в Xcode pre 11.2
источник
UITextField
НЕ,UITextView
пожалуйста, прочитайте вопросы / ответы более внимательно.В ios нет такого свойства для добавления заполнителя непосредственно в TextView, вместо этого вы можете добавить метку и показать / скрыть изменение в textView. SWIFT 2.0 и убедитесь, что для реализации textviewdelegate
источник
Swift - я написал класс, который унаследовал UITextView, и добавил UILabel в качестве подпредставления, чтобы действовать в качестве заполнителя.
источник
Мне нравится решение @ nerdist. Исходя из этого, я создал расширение для
UITextView
:Например, в классе ViewController я так его использую:
Заполнитель на UITextview!
ОБНОВИТЬ :
Если вы изменяете текст textview в коде, не забудьте вызвать метод updateVisibitly, чтобы скрыть заполнитель:
Чтобы запретить добавление заполнителя более одного раза,
add()
вextension
.источник
В swift2.2:
}
В swift3:
Класс CustomTextView: UITextView {
}
Я написал класс по быстрому. Вам нужно импортировать этот класс, когда это необходимо.
источник
Я не могу добавить комментарий из-за репутации. добавьте еще одного делегата в ответ @clearlight.
это нужно
потому что
textViewDidChange
не называется первый разисточник
Нет, там нет места для текста. Вы должны поставить метку над ним, когда пользователь вводит текстовое представление, затем скрыть его или установить значение по умолчанию, когда пользователь вводит, удалить все значения.
источник
источник
Мне пришлось отправить очередь, чтобы текст заполнителя снова появился после завершения редактирования.
источник
Swift:
Добавьте свой
TextView
@IBOutlet
:В
viewWillAppear
метод добавьте следующее:Пожалуйста, добавьте
Delegate
расширение Using (UITextViewDelegate):источник
Наше решение позволяет избежать использования свойств
UITextView
text
иtextColor
свойств, что удобно, если вы ведете счетчик символов.Это просто:
1) Создайте пустышку
UITextView
в раскадровке с теми же свойствами, что и у мастераUITextView
. Присвойте замещающий текст пустому тексту.2) Совместите верхний, левый и правый края двух
UITextViews.
3) Поместите манекен позади мастера.
4) Переопределите
textViewDidChange(textView:)
функцию делегата мастера и покажите манекен, если мастер имеет 0 символов. В противном случае покажи мастера.Это предполагает, что оба
UITextViews
имеют прозрачный фон. Если это не так, поместите манекен сверху, когда есть 0 символов, и вставьте его внизу, если> 0 символов. Вам также придется поменять местами респонденты, чтобы убедиться, что курсор следует вправоUITextView
.источник
Свифт 4, 4.2 и 5
источник