我正在使用Xamarin进行跨平台项目,并且在用户在UITextField上键入内容时遇到时间延迟的问题。
我有一个自定义弹出窗口,该弹出窗口执行搜索产品功能以将所选产品添加到购物车:
用户在文本视图中输入产品代码:
当前,当用户输入产品代码时,每当searchCode = 2时,应用程序都会立即显示指示符,然后开始搜索,并且用户可以在搜索完成后继续输入。
我想优化此逻辑:每当用户停止键入类似1的字符(延迟1的字符)时,应用程序都会进行搜索。
是否有任何事件可以检测用户何时开始和停止输入UITextField?
public class PopupOrderProductViewModel : BasePopupOrderViewModel
{
private string _searchCode;
public string SearchCode
{
get => _searchCode;
set
{
SetProperty(ref _searchCode, value);
if (_shouldSearchCodes)
{
//hiding keyboard then start searching product by code
//I want to change it into: app will start searching whenever user stop typing for 1s
if ( value.Trim().Length >= 2)
{
SearchCodes();
}
else
{
ProductCodeItemViewModels = null;
}
}
else
{
_shouldSearchCodes = true;
}
}
}
SearchCode函数中的代码:
private async void SearchCodes()
{
MasterViewModel.Instance.ShowIndicator();
var productCodes = await ProductCodeService.SearchProductCode(SearchCode);
MasterViewModel.Instance.HideIndicator();
ShouldShowKeyboard = true;
ProductCodeItemViewModels = productCodes?.Select(k => new ProductCodeItemViewModel(new OrderedProduct
{
ProductCode = k
}, OnItemClicked)).ToList();
}
任何建议将不胜感激!
答案 0 :(得分:0)
您可以使用UITextField.Notifications.ObserveTextFieldTextDidChange
来检测UITextField中的文本更改事件。然后,我添加了一个inputCount
属性来记录用户的输入计数以控制搜索事件。
在SearchCodes
函数中,如果您现在传递的搜索次数不等于inputCount
,则意味着用户已在1秒钟内输入了文本,并且不会在其中执行代码if语句。
代码如下:
public partial class ViewController : UIViewController
{
public ViewController(IntPtr handle) : base(handle)
{
}
int inputCount = 0;
public override void ViewDidLoad()
{
base.ViewDidLoad();
// Perform any additional setup after loading the view, typically from a nib.
UITextField textF = new UITextField();
textF.BorderStyle = UITextBorderStyle.Line;
textF.Frame = new CoreGraphics.CGRect(100, 100, 100, 50);
View.Add(textF);
var notification = UITextField.Notifications.ObserveTextFieldTextDidChange((sender, args) => {
/* Access strongly typed args */
Console.WriteLine("Notification: {0}", args.Notification);
inputCount++;
PerformSelector(new ObjCRuntime.Selector("SearchCodes:"), (NSString)(inputCount.ToString()), 2);
});
}
[Export("SearchCodes:")]
public void SearchCodes(NSString count)
{
if (Convert.ToInt32(count) == this.inputCount)
{
Console.WriteLine("start search");
UIAlertView alertV = new UIAlertView("start search", "",null,"ok");
alertV.Show();
}
}
}