通过点击文本字段进行导航

Posted

技术标签:

【中文标题】通过点击文本字段进行导航【英文标题】:Navigation by tap on textfield 【发布时间】:2018-09-25 12:41:23 【问题描述】:

对于一个关于火车时间的项目,我想确保当我点击 UITextfield 时,我会转到一个表格视图。从这里我从列表中选择一个电台,然后他必须返回第一个视图,但他必须在相应的文本字段中填写电台。

如果有人能帮我解决这个问题,那就太好了。

提前致谢。

整个项目在MvvmCross,ios(Xamarin)中疯了

【问题讨论】:

【参考方案1】:

我可能会听UITextFieldEditingDidBegin 找出 UITextField 是焦点。但是,开箱即用不支持此绑定。

然后你要做的是获取这个类:https://github.com/MvvmCross/MvvmCross/blob/develop/MvvmCross/Platforms/Ios/Binding/Target/MvxUITextFieldTextFocusTargetBinding.cs,它是UITextFieldEditingDidEnd 的绑定定义,只需将其更改为UITextFieldEditingDidBegin,并让它在该事件触发时触发ICommand

这看起来像:

public class MvxUITextFieldEditingDidBeginTargetBinding : MvxTargetBinding

    private IDisposable _subscription;
    private ICommand _command;

    protected UITextField TextField => Target as UITextField;

    public override Type TargetType => typeof(ICommand);
    public override MvxBindingMode DefaultMode => MvxBindingMode.OneWay;

    public MvxUITextFieldEditingDidBeginTargetBinding(object target)
        : base(target)
    
    

    public override void SetValue(object value)
    
        _command = value as ICommand;
    

    public override void SubscribeToEvents()
    
        var textField = TextField;
        if (TextField == null) return;

        _subscription = textField.WeakSubscribe(nameof(textField.EditingDidBegin), HandleEditingBegin);
    

    private void HandleEditingBegin(object sender, EventArgs e)
    
        if (_command == null) return;
        if (!_command.CanExecute(null)) return;

        _command.Execute(null);
    

    protected override void Dispose(bool isDisposing)
    
        base.Dispose(isDisposing);
        if (!isDisposing) return;

        _subscription?.Dispose();
        _subscription = null;
    

然后您需要在FillTargetFactoriesSetup 类中注册它:

protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)

    base.FillTargetFactories(registry);

    registry.RegisterCustomBindingFactory<UIControl>(
        "EditingDidEnd",
        view =>
            new MvxUITextFieldEditingDidBeginTargetBinding(view));

这将允许您在绑定中绑定到EditingDidEnd

set.Bind(textField).For("EditingDidEnd").To(vm => vm.SomeCommand);

您可以在 MvvmCross 文档中阅读更多关于自定义绑定的信息:https://www.mvvmcross.com/documentation/advanced/custom-data-binding

【讨论】:

好的,想弄清楚。但是我需要在哪里放置 MvxUITextFieldEditingDidBeginTargetBinding 和 MvxUITextFieldTextFocusTargetBinding 类? VS 也找不到 FillTargetFactories?只是为了确保,我正在使用一个以类库为核心的单视图应用程序。 MvvmCross已经自带了FocusTarget绑定,所以你不需要放在任何地方,它只是作为我发布的类的参考。我发布的那个放在你的 iOS App Project 中,因为它包含 iOS View 代码。 FillTargetFactories 是您在 Setup 类中覆盖的方法。

以上是关于通过点击文本字段进行导航的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 焦点管理 FocusScope 组件

添加/删除 UITableView 行时如何防止文本字段变空?

如何从 iOS 键盘扩展中检测到通过在 iMessage 中点击“发送”等操作清除了文本字段?

通过第一个文本字段的 ajax 进行数据验证后禁用第二个文本字段

无法通过单击选择文本字段(Swift)

抓取网页并通过单击按钮进行导航