Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > alatar

Оценить эту запись

Баги TextField в iOS

Запись от alatar размещена 29.07.2013 в 00:39
Обновил(-а) alatar 31.07.2013 в 01:06

На днях столкнулся с занимательным багом в TextField под iOS.
Суть в следующем, если программно менять текст в текстовом поле, то введенный ранее текст выделяется и... добавленный текст не отображается. Хотя свойство text при этом изменяется, правда ровно до того момента пока не будет нажата любая клавиша на клавиатуре.

Как воспроизвести
Вот минимальный код для воспроизведения бага:
Код AS3:
package
{
	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.FocusEvent;
	import flash.events.MouseEvent;
	import flash.system.Capabilities;
	import flash.text.TextField;
	import flash.text.TextFieldType;
 
	public class TextFieldBug extends Sprite
	{
		private var _textField:TextField;
		private var _dpi:Number = Capabilities.screenDPI;
 
		public function TextFieldBug()
		{
			super();
 
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
 
			stage.addEventListener(FocusEvent.MOUSE_FOCUS_CHANGE, stage_mouseFocusChangeHandler);
 
			_textField = new TextField();
			_textField.type = TextFieldType.INPUT;
			_textField.height = realToPixels(0.5);
			_textField.width = realToPixels(2);
 
			addChild(_textField);
 
			var button:Sprite = createButton();
			addChild(button);
 
			button.addEventListener(MouseEvent.CLICK, button_clickHandler);
 
			_textField.requestSoftKeyboard();
		}
 
		private function button_clickHandler(event:MouseEvent):void
		{
			_textField.text += ":(";
		}
 
		//lock focus on TextField
		private function stage_mouseFocusChangeHandler(event:FocusEvent):void
		{
			if (event.relatedObject is TextField)
				return;
 
			event.preventDefault();
		}
 
		private function createButton():Sprite
		{
			var button:Sprite = new Sprite();
			var g:Graphics = button.graphics;
 
			g.beginFill(0xFF0000);
			g.drawRect(0, 0, realToPixels(1), realToPixels(1));
			g.endFill();
 
			return button;
		}
 
		private function realToPixels(inch:Number):Number
		{
			return inch * _dpi;
		}
	}
}
Запустить на iOS девайсе, ввести что-нибудь с клавиатуры и нажать синюю кнопку.

Пути обхода
К счастью удалось найти workaround.
Необходимо создать два текстовых поля, одно будет отображаться на экране, второе понадобится позже. В момент когда необходимо добавить текст, копируем текст из первого поля во второе. Убираем первое поле, добавляем второе и вызываем на втором поле requestSoftKeyboard().
При этом клавиатура останется на экране хотя и будут отправлены SOFT_KEYBOARD_DEACTIVATE и SOFT_KEYBOARD_ACTIVATE для соответствующих текстовых полей.

А как же Android?
В андроиде ситуация лучше. Текст добавляется... правда после курсора. Приходится смещать курсор в конец строки или использовать костыль для iOS.

Проверено в iOS6 на iPad и на Samsung Galaxy 3 с Android 4.1.2 для AIR 3.7.
У кого есть возможность проверить на иных девайсах и версиях AIR просьба отписаться и при подтверждении проголосовать тут.
Всего комментариев 4

Комментарии

Старый 29.07.2013 23:47 iNils вне форума
iNils
 
Аватар для iNils
Название "Баги TextField" заставляет думать, что баги везде, хотя речь идет о мобильных устройствах. То есть, вводит в заблуждение.
Старый 30.07.2013 01:07 alatar вне форума
alatar
 
Аватар для alatar
Предложи название.
Старый 30.07.2013 13:38 iNils вне форума
iNils
 
Аватар для iNils
Баги TextField в iOS?)
Старый 10.10.2013 15:06 alatar вне форума
alatar
 
Аватар для alatar
В связи с низким приоритетом (приоритет напрямую связан с количеством голосов), баг отложен до "лучших времен" (как показывает практика, это может длиться годами). Всем спасибо.
 

 


Часовой пояс GMT +4, время: 23:38.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.