From 1b212bfce5b61f779f30e29566d62c37c0cc36f7 Mon Sep 17 00:00:00 2001 From: Rossen Hristov Date: Wed, 20 May 2015 13:15:42 +0300 Subject: [PATCH 1/3] Resolved #184: Hint property for TextView. --- .../text-view-tests-native.android.ts | 4 ++ .../ui/text-view/text-view-tests-native.d.ts | 1 + .../text-view/text-view-tests-native.ios.ts | 9 +++ apps/tests/ui/text-view/text-view-tests.ts | 71 +++++++++++++++++++ .../editable-text-base-common.ts | 27 +++++++ .../editable-text-base.android.ts | 9 +++ ui/editable-text-base/editable-text-base.d.ts | 10 +++ ui/styling/stylers.ios.ts | 21 +++++- ui/text-base/text-base.d.ts | 2 + ui/text-field/text-field-common.ts | 13 ---- ui/text-field/text-field.android.ts | 12 ---- ui/text-field/text-field.d.ts | 10 --- ui/text-field/text-field.ios.ts | 12 ++-- ui/text-view/text-view.ios.ts | 38 ++++++++++ 14 files changed, 194 insertions(+), 45 deletions(-) diff --git a/apps/tests/ui/text-view/text-view-tests-native.android.ts b/apps/tests/ui/text-view/text-view-tests-native.android.ts index 89a503124..8f144aa56 100644 --- a/apps/tests/ui/text-view/text-view-tests-native.android.ts +++ b/apps/tests/ui/text-view/text-view-tests-native.android.ts @@ -16,6 +16,10 @@ export function getNativeEditable(textView: textViewModule.TextView): boolean { } } +export function getNativeHint(textView: textViewModule.TextView): string { + return textView.android.getHint(); +} + export function getNativeFontSize(textView: textViewModule.TextView): number { var density = utilsModule.layout.getDisplayDensity(); return textView.android.getTextSize() / density; diff --git a/apps/tests/ui/text-view/text-view-tests-native.d.ts b/apps/tests/ui/text-view/text-view-tests-native.d.ts index 151a5da26..6446745c2 100644 --- a/apps/tests/ui/text-view/text-view-tests-native.d.ts +++ b/apps/tests/ui/text-view/text-view-tests-native.d.ts @@ -3,6 +3,7 @@ import textViewModule = require("ui/text-view"); import colorModule = require("color"); export declare function getNativeText(textView: textViewModule.TextView): string; +export declare function getNativeHint(textView: textViewModule.TextView): string; export declare function getNativeEditable(textView: textViewModule.TextView): boolean; export declare function getNativeFontSize(textView: textViewModule.TextView): number; export declare function getNativeColor(textView: textViewModule.TextView): colorModule.Color; diff --git a/apps/tests/ui/text-view/text-view-tests-native.ios.ts b/apps/tests/ui/text-view/text-view-tests-native.ios.ts index 9afab1063..e815afcc3 100644 --- a/apps/tests/ui/text-view/text-view-tests-native.ios.ts +++ b/apps/tests/ui/text-view/text-view-tests-native.ios.ts @@ -7,6 +7,15 @@ export function getNativeText(textView: textViewModule.TextView): string { return textView.ios.text; } +export function getNativeHint(textView: textViewModule.TextView): string { + // There is no native hint + if (textView.hint !== "") { + return textView.ios.text; + } + + return ""; +} + export function getNativeEditable(textView: textViewModule.TextView): boolean { return textView.ios.editable; } diff --git a/apps/tests/ui/text-view/text-view-tests.ts b/apps/tests/ui/text-view/text-view-tests.ts index 417d60c3a..b47a412d1 100644 --- a/apps/tests/ui/text-view/text-view-tests.ts +++ b/apps/tests/ui/text-view/text-view-tests.ts @@ -135,6 +135,77 @@ export var testTextIsUpdatedWhenUserTypes = function () { }); } +export var testSetHint = function () { + helper.buildUIAndRunTest(_createTextViewFunc(), function (views: Array) { + var textView = views[0]; + + // + // ### Setting the hint of a TextView + // ``` JavaScript + textView.hint = "type your username here"; + // ``` + // + + var expectedValue = "type your username here"; + var actualValue = textViewTestsNative.getNativeHint(textView); + TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + }); +} + +export var testBindHintDirectlyToModel = function () { + helper.buildUIAndRunTest(_createTextViewFunc(), function (views: Array) { + var textView = views[0]; + + // + // ### Binding hint property directly to model + // ``` JavaScript + var model = new observable.Observable(); + model.set("hint", "type your username here"); + var options: bindable.BindingOptions = { + sourceProperty: "hint", + targetProperty: "hint" + } + textView.bind(options, model); + //// TextView.hint is now "type your username here" + // + TKUnit.assert(textView.hint === "type your username here", "Actual: " + textView.text + "; Expected: " + "type your username here"); + TKUnit.assert(textViewTestsNative.getNativeHint(textView) === "type your username here", "Actual: " + textViewTestsNative.getNativeHint(textView) + "; Expected: " + "type your username here"); + // + model.set("hint", "type your password here"); + //// TextView.hint is now "type your password here" + // + TKUnit.assert(textView.hint === "type your password here", "Actual: " + textView.text + "; Expected: " + "type your password here"); + TKUnit.assert(textViewTestsNative.getNativeHint(textView) === "type your password here", "Actual: " + textViewTestsNative.getNativeHint(textView) + "; Expected: " + "type your password here"); + // + // ``` + // + }); +} + +export var testBindHintToBindingConext = function () { + helper.buildUIAndRunTest(_createTextViewFunc(), function (views: Array) { + var textView = views[0]; + var page = views[1]; + + var model = new observable.Observable(); + model.set("hint", "type your username here"); + page.bindingContext = model; + + var options: bindable.BindingOptions = { + sourceProperty: "hint", + targetProperty: "hint" + } + + textView.bind(options); + TKUnit.assert(textView.hint === "type your username here", "Actual: " + textView.hint + "; Expected: " + "type your username here"); + TKUnit.assert(textViewTestsNative.getNativeHint(textView) === "type your username here", "Actual: " + textViewTestsNative.getNativeHint(textView) + "; Expected: " + "type your username here"); + + model.set("hint", "type your password here"); + TKUnit.assert(textView.hint === "type your password here", "Actual: " + textView.text + "; Expected: " + "type your password here"); + TKUnit.assert(textViewTestsNative.getNativeHint(textView) === "type your password here", "Actual: " + textViewTestsNative.getNativeHint(textView) + "; Expected: " + "type your password here"); + }); +} + export var testSetEditable = function () { helper.buildUIAndRunTest(_createTextViewFunc(), function (views: Array) { var textView = views[0]; diff --git a/ui/editable-text-base/editable-text-base-common.ts b/ui/editable-text-base/editable-text-base-common.ts index c39332656..1ad24746c 100644 --- a/ui/editable-text-base/editable-text-base-common.ts +++ b/ui/editable-text-base/editable-text-base-common.ts @@ -40,6 +40,13 @@ var autocorrectProperty = new dependencyObservable.Property( new proxy.PropertyMetadata(undefined, dependencyObservable.PropertyMetadataSettings.None) ); +export var hintProperty = new dependencyObservable.Property( + "hint", + "EditableTextBase", + new proxy.PropertyMetadata("") + ); + + function onKeyboardTypePropertyChanged(data: dependencyObservable.PropertyChangeData) { var editableTextBase = data.object; editableTextBase._onKeyboardTypePropertyChanged(data); @@ -75,6 +82,13 @@ function onAutocorrectPropertyChanged(data: dependencyObservable.PropertyChangeD (autocorrectProperty.metadata).onSetNativeValue = onAutocorrectPropertyChanged; +function onHintPropertyChanged(data: dependencyObservable.PropertyChangeData) { + var editableTextBase = data.object; + editableTextBase._onHintPropertyChanged(data); +} + +(hintProperty.metadata).onSetNativeValue = onHintPropertyChanged; + export class EditableTextBase extends textBase.TextBase implements definition.EditableTextBase { public static keyboardTypeProperty = keyboardTypeProperty; @@ -89,6 +103,8 @@ export class EditableTextBase extends textBase.TextBase implements definition.Ed public static autocorrectProperty = autocorrectProperty; + public static hintProperty = hintProperty; + constructor(options?: definition.Options) { super(options); } @@ -141,6 +157,13 @@ export class EditableTextBase extends textBase.TextBase implements definition.Ed this._setValue(EditableTextBase.autocorrectProperty, value); } + get hint(): string { + return this._getValue(EditableTextBase.hintProperty); + } + set hint(value: string) { + this._setValue(EditableTextBase.hintProperty, value); + } + public dismissSoftInput() { // } @@ -165,4 +188,8 @@ export class EditableTextBase extends textBase.TextBase implements definition.Ed public _onAutocorrectPropertyChanged(data: dependencyObservable.PropertyChangeData) { // } + + public _onHintPropertyChanged(data: dependencyObservable.PropertyChangeData) { + // + } } \ No newline at end of file diff --git a/ui/editable-text-base/editable-text-base.android.ts b/ui/editable-text-base/editable-text-base.android.ts index 12aad1818..40c45c298 100644 --- a/ui/editable-text-base/editable-text-base.android.ts +++ b/ui/editable-text-base/editable-text-base.android.ts @@ -253,4 +253,13 @@ export class EditableTextBase extends common.EditableTextBase { editableTextBase.android.setInputType(inputType); } + + public _onHintPropertyChanged(data: dependencyObservable.PropertyChangeData) { + var editableTextBase = data.object; + if (!editableTextBase.android) { + return; + } + + editableTextBase.android.setHint(data.newValue); + } } \ No newline at end of file diff --git a/ui/editable-text-base/editable-text-base.d.ts b/ui/editable-text-base/editable-text-base.d.ts index 734acc8fd..b79da4e2e 100644 --- a/ui/editable-text-base/editable-text-base.d.ts +++ b/ui/editable-text-base/editable-text-base.d.ts @@ -46,6 +46,11 @@ */ autocorrect: boolean; + /** + * Gets or sets the placeholder text. + */ + hint: string; + /** * Hides the soft input method, ususally a soft keyboard. */ @@ -81,6 +86,11 @@ */ autocapitalizationType?: string; + /** + * Gets or sets the placeholder text. + */ + hint?: string; + /** * Enables or disables autocorrection. */ diff --git a/ui/styling/stylers.ios.ts b/ui/styling/stylers.ios.ts index 553024af2..aed8c699b 100644 --- a/ui/styling/stylers.ios.ts +++ b/ui/styling/stylers.ios.ts @@ -409,21 +409,36 @@ export class TextViewStyler implements definition.stylers.Styler { private static setColorProperty(view: view.View, newValue: any) { var textView: UITextView = view._nativeView; if (textView) { - textView.textColor = newValue; + TextViewStyler._setTextViewColor(textView, newValue); } } private static resetColorProperty(view: view.View, nativeValue: any) { var textView: UITextView = view._nativeView; if (textView) { - textView.textColor = nativeValue; + TextViewStyler._setTextViewColor(textView, nativeValue); + } + } + + private static _setTextViewColor(textView: UITextView, newValue: any) { + var color: UIColor = newValue; + if ((textView).isShowingHint && color) { + textView.textColor = (color).colorWithAlphaComponent(0.22); + } + else { + textView.textColor = color; } } private static getNativeColorValue(view: view.View): any { var textView: UITextView = view._nativeView; if (textView) { - return textView.textColor; + if ((textView).isShowingHint && textView.textColor) { + return textView.textColor.colorWithAlphaComponent(1); + } + else { + return textView.textColor; + } } } diff --git a/ui/text-base/text-base.d.ts b/ui/text-base/text-base.d.ts index 9dadae4dd..6df8155d5 100644 --- a/ui/text-base/text-base.d.ts +++ b/ui/text-base/text-base.d.ts @@ -39,6 +39,8 @@ * Gets or sets a formatted string. */ formattedText: formattedString.FormattedString; + + _onTextPropertyChanged(data: dependencyObservable.PropertyChangeData); } /** diff --git a/ui/text-field/text-field-common.ts b/ui/text-field/text-field-common.ts index 0c6f5c0de..d71702ffd 100644 --- a/ui/text-field/text-field-common.ts +++ b/ui/text-field/text-field-common.ts @@ -4,12 +4,6 @@ import proxy = require("ui/core/proxy"); import textBase = require("ui/text-base"); import editableTextBase = require("ui/editable-text-base"); -export var hintProperty = new dependencyObservable.Property( - "hint", - "TextField", - new proxy.PropertyMetadata("") - ); - export var secureProperty = new dependencyObservable.Property( "secure", "TextField", @@ -25,13 +19,6 @@ export class TextField extends editableTextBase.EditableTextBase implements defi super(options); } - get hint(): string { - return this._getValue(hintProperty); - } - set hint(value: string) { - this._setValue(hintProperty, value); - } - get secure(): boolean { return this._getValue(secureProperty); } diff --git a/ui/text-field/text-field.android.ts b/ui/text-field/text-field.android.ts index 926443421..e2e0ddc0d 100644 --- a/ui/text-field/text-field.android.ts +++ b/ui/text-field/text-field.android.ts @@ -2,18 +2,6 @@ import dependencyObservable = require("ui/core/dependency-observable"); import proxy = require("ui/core/proxy"); -function onHintPropertyChanged(data: dependencyObservable.PropertyChangeData) { - var textField = data.object; - if (!textField.android) { - return; - } - - textField.android.setHint(data.newValue); -} - -// register the setNativeValue callbacks -(common.hintProperty.metadata).onSetNativeValue = onHintPropertyChanged; - function onSecurePropertyChanged(data: dependencyObservable.PropertyChangeData) { var textField = data.object; if (!textField.android) { diff --git a/ui/text-field/text-field.d.ts b/ui/text-field/text-field.d.ts index cefa48b28..b02c3647b 100644 --- a/ui/text-field/text-field.d.ts +++ b/ui/text-field/text-field.d.ts @@ -20,11 +20,6 @@ declare module "ui/text-field" { */ ios: UITextField; - /** - * Gets or sets the text of a text field hint/placeholder. - */ - hint: string; - /** * Gets or sets if a text field is for password entry. */ @@ -35,11 +30,6 @@ declare module "ui/text-field" { * Defines interface for an optional parameter used to create a editable-text-base component. */ export interface Options extends editableTextBase.Options { - /** - * Gets or sets the text of a text field hint/placeholder. - */ - hint?: string; - /** * Gets or sets if a text field is for password entry. */ diff --git a/ui/text-field/text-field.ios.ts b/ui/text-field/text-field.ios.ts index 7ba604185..13336b7ba 100644 --- a/ui/text-field/text-field.ios.ts +++ b/ui/text-field/text-field.ios.ts @@ -4,13 +4,6 @@ import proxy = require("ui/core/proxy"); import textBase = require("ui/text-base"); import enums = require("ui/enums"); -function onHintPropertyChanged(data: dependencyObservable.PropertyChangeData) { - var textField = data.object; - textField.ios.placeholder = data.newValue; -} - -(common.hintProperty.metadata).onSetNativeValue = onHintPropertyChanged; - function onSecurePropertyChanged(data: dependencyObservable.PropertyChangeData) { var textField = data.object; textField.ios.secureTextEntry = data.newValue; @@ -89,4 +82,9 @@ export class TextField extends common.TextField { get ios(): UITextField { return this._ios; } + + public _onHintPropertyChanged(data: dependencyObservable.PropertyChangeData) { + var textField = data.object; + textField.ios.placeholder = data.newValue; + } } \ No newline at end of file diff --git a/ui/text-view/text-view.ios.ts b/ui/text-view/text-view.ios.ts index 679977ca1..387d17fa3 100644 --- a/ui/text-view/text-view.ios.ts +++ b/ui/text-view/text-view.ios.ts @@ -2,6 +2,7 @@ import dependencyObservable = require("ui/core/dependency-observable"); import textBase = require("ui/text-base"); import enums = require("ui/enums"); +import color = require("color"); // merge the exports of the common file with the exports of this file declare var exports; @@ -21,12 +22,18 @@ class UITextViewDelegateImpl extends NSObject implements UITextViewDelegate { return this; } + public textViewShouldBeginEditing(textView: UITextView): boolean { + this._owner._hideHint(); + return true; + } + public textViewDidEndEditing(textView: UITextView) { if (this._owner.updateTextTrigger === enums.UpdateTextTrigger.focusLost) { this._owner._onPropertyChangedFromNative(textBase.TextBase.textProperty, textView.text); } this._owner.dismissSoftInput(); + this._owner._refreshHintState(this._owner.hint); } public textViewDidChange(textView: UITextView) { @@ -69,4 +76,35 @@ export class TextView extends common.TextView { public _onEditablePropertyChanged(data: dependencyObservable.PropertyChangeData) { this._ios.editable = data.newValue; } + + public _onHintPropertyChanged(data: dependencyObservable.PropertyChangeData) { + var textView = data.object; + this._refreshHintState(data.newValue); + } + + public _onTextPropertyChanged(data: dependencyObservable.PropertyChangeData) { + super._onTextPropertyChanged(data); + this._refreshHintState(this.hint); + } + + public _refreshHintState(hint: string) { + if (hint && !this.ios.text) { + this._showHint(hint); + } + else { + this._hideHint(); + } + } + + public _showHint(hint: string) { + this.ios.textColor = this.ios.textColor ? this.ios.textColor.colorWithAlphaComponent(0.22) : UIColor.blackColor().colorWithAlphaComponent(0.22); + this.ios.text = hint + ""; + (this.ios).isShowingHint = true; + } + + public _hideHint() { + this.ios.textColor = this.color ? this.color.ios : null; + this.ios.text = this.text + ""; + (this.ios).isShowingHint = false; + } } \ No newline at end of file From be188119f0e1cbcc77477531fedd1ef2d365b324 Mon Sep 17 00:00:00 2001 From: Rossen Hristov Date: Wed, 20 May 2015 13:29:26 +0300 Subject: [PATCH 2/3] tslint --- ui/editable-text-base/editable-text-base-common.ts | 1 - ui/text-view/text-view.ios.ts | 2 -- 2 files changed, 3 deletions(-) diff --git a/ui/editable-text-base/editable-text-base-common.ts b/ui/editable-text-base/editable-text-base-common.ts index 1ad24746c..3d31c9b29 100644 --- a/ui/editable-text-base/editable-text-base-common.ts +++ b/ui/editable-text-base/editable-text-base-common.ts @@ -46,7 +46,6 @@ export var hintProperty = new dependencyObservable.Property( new proxy.PropertyMetadata("") ); - function onKeyboardTypePropertyChanged(data: dependencyObservable.PropertyChangeData) { var editableTextBase = data.object; editableTextBase._onKeyboardTypePropertyChanged(data); diff --git a/ui/text-view/text-view.ios.ts b/ui/text-view/text-view.ios.ts index 387d17fa3..cdae529ef 100644 --- a/ui/text-view/text-view.ios.ts +++ b/ui/text-view/text-view.ios.ts @@ -2,7 +2,6 @@ import dependencyObservable = require("ui/core/dependency-observable"); import textBase = require("ui/text-base"); import enums = require("ui/enums"); -import color = require("color"); // merge the exports of the common file with the exports of this file declare var exports; @@ -78,7 +77,6 @@ export class TextView extends common.TextView { } public _onHintPropertyChanged(data: dependencyObservable.PropertyChangeData) { - var textView = data.object; this._refreshHintState(data.newValue); } From f6a92d85a4a3d1af0a74c965556e4b01f0a69374 Mon Sep 17 00:00:00 2001 From: Rossen Hristov Date: Wed, 20 May 2015 16:45:02 +0300 Subject: [PATCH 3/3] Tests. --- .../text-view/text-view-tests-native.ios.ts | 4 +- apps/tests/ui/text-view/text-view-tests.ts | 61 +++++++++++++++++-- ui/text-view/text-view.ios.ts | 10 +-- 3 files changed, 64 insertions(+), 11 deletions(-) diff --git a/apps/tests/ui/text-view/text-view-tests-native.ios.ts b/apps/tests/ui/text-view/text-view-tests-native.ios.ts index e815afcc3..8393ddf81 100644 --- a/apps/tests/ui/text-view/text-view-tests-native.ios.ts +++ b/apps/tests/ui/text-view/text-view-tests-native.ios.ts @@ -8,8 +8,8 @@ export function getNativeText(textView: textViewModule.TextView): string { } export function getNativeHint(textView: textViewModule.TextView): string { - // There is no native hint - if (textView.hint !== "") { + // There is no native hint so we use a hack and sett 22% opaque text. + if ((textView.ios).isShowingHint) { return textView.ios.text; } diff --git a/apps/tests/ui/text-view/text-view-tests.ts b/apps/tests/ui/text-view/text-view-tests.ts index b47a412d1..6ee4b5957 100644 --- a/apps/tests/ui/text-view/text-view-tests.ts +++ b/apps/tests/ui/text-view/text-view-tests.ts @@ -138,6 +138,7 @@ export var testTextIsUpdatedWhenUserTypes = function () { export var testSetHint = function () { helper.buildUIAndRunTest(_createTextViewFunc(), function (views: Array) { var textView = views[0]; + textView.text = ""; // // ### Setting the hint of a TextView @@ -155,6 +156,7 @@ export var testSetHint = function () { export var testBindHintDirectlyToModel = function () { helper.buildUIAndRunTest(_createTextViewFunc(), function (views: Array) { var textView = views[0]; + textView.text = ""; // // ### Binding hint property directly to model @@ -168,13 +170,13 @@ export var testBindHintDirectlyToModel = function () { textView.bind(options, model); //// TextView.hint is now "type your username here" // - TKUnit.assert(textView.hint === "type your username here", "Actual: " + textView.text + "; Expected: " + "type your username here"); + TKUnit.assert(textView.hint === "type your username here", "Actual: " + textView.hint + "; Expected: " + "type your username here"); TKUnit.assert(textViewTestsNative.getNativeHint(textView) === "type your username here", "Actual: " + textViewTestsNative.getNativeHint(textView) + "; Expected: " + "type your username here"); // model.set("hint", "type your password here"); //// TextView.hint is now "type your password here" // - TKUnit.assert(textView.hint === "type your password here", "Actual: " + textView.text + "; Expected: " + "type your password here"); + TKUnit.assert(textView.hint === "type your password here", "Actual: " + textView.hint + "; Expected: " + "type your password here"); TKUnit.assert(textViewTestsNative.getNativeHint(textView) === "type your password here", "Actual: " + textViewTestsNative.getNativeHint(textView) + "; Expected: " + "type your password here"); // // ``` @@ -185,6 +187,7 @@ export var testBindHintDirectlyToModel = function () { export var testBindHintToBindingConext = function () { helper.buildUIAndRunTest(_createTextViewFunc(), function (views: Array) { var textView = views[0]; + textView.text = ""; var page = views[1]; var model = new observable.Observable(); @@ -201,11 +204,61 @@ export var testBindHintToBindingConext = function () { TKUnit.assert(textViewTestsNative.getNativeHint(textView) === "type your username here", "Actual: " + textViewTestsNative.getNativeHint(textView) + "; Expected: " + "type your username here"); model.set("hint", "type your password here"); - TKUnit.assert(textView.hint === "type your password here", "Actual: " + textView.text + "; Expected: " + "type your password here"); + TKUnit.assert(textView.hint === "type your password here", "Actual: " + textView.hint + "; Expected: " + "type your password here"); TKUnit.assert(textViewTestsNative.getNativeHint(textView) === "type your password here", "Actual: " + textViewTestsNative.getNativeHint(textView) + "; Expected: " + "type your password here"); }); } +export var testHintPlusTextiOS = function () { + helper.buildUIAndRunTest(_createTextViewFunc(), function (views: Array) { + var textView = views[0]; + if (!textView.ios) { + return; + } + + var expectedValue; + var actualValue; + + textView.hint = "hint"; + textView.text = "text"; + + expectedValue = "text"; + actualValue = textViewTestsNative.getNativeText(textView); + TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + + textView.text = ""; + expectedValue = "hint"; + actualValue = textViewTestsNative.getNativeText(textView); + TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + }); +} + +export var testHintColoriOS = function () { + helper.buildUIAndRunTest(_createTextViewFunc(), function (views: Array) { + var textView = views[0]; + if (!textView.ios) { + return; + } + + textView.text = ""; + textView.color = new colorModule.Color("red"); + textView.hint = "hint"; + + var expectedValue; + var actualValue; + + expectedValue = "#38.1999948ff0000"; // 22% red + actualValue = textViewTestsNative.getNativeColor(textView).hex; + TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + + textView.text = "text"; + + expectedValue = "#ffff0000"; // red + actualValue = textViewTestsNative.getNativeColor(textView).hex; + TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + }); +} + export var testSetEditable = function () { helper.buildUIAndRunTest(_createTextViewFunc(), function (views: Array) { var textView = views[0]; @@ -413,4 +466,4 @@ export var testMemoryLeak = function () { helper.buildUIWithWeakRefAndInteract(_createTextViewFunc, function (textView) { textViewTestsNative.typeTextNatively(textView, "Hello, world!"); }); -} +} \ No newline at end of file diff --git a/ui/text-view/text-view.ios.ts b/ui/text-view/text-view.ios.ts index cdae529ef..fbe5a59b5 100644 --- a/ui/text-view/text-view.ios.ts +++ b/ui/text-view/text-view.ios.ts @@ -32,7 +32,7 @@ class UITextViewDelegateImpl extends NSObject implements UITextViewDelegate { } this._owner.dismissSoftInput(); - this._owner._refreshHintState(this._owner.hint); + this._owner._refreshHintState(this._owner.hint, textView.text); } public textViewDidChange(textView: UITextView) { @@ -77,16 +77,16 @@ export class TextView extends common.TextView { } public _onHintPropertyChanged(data: dependencyObservable.PropertyChangeData) { - this._refreshHintState(data.newValue); + this._refreshHintState(data.newValue, this.text); } public _onTextPropertyChanged(data: dependencyObservable.PropertyChangeData) { super._onTextPropertyChanged(data); - this._refreshHintState(this.hint); + this._refreshHintState(this.hint, data.newValue); } - public _refreshHintState(hint: string) { - if (hint && !this.ios.text) { + public _refreshHintState(hint: string, text: string) { + if (hint && !text) { this._showHint(hint); } else {