适用于Android的包含控件的iOS设备

时间:2018-07-06 11:48:04

标签: android ios xamarin mvvmcross

我正在使用MVVMCross(5.1.1)为iOS和Android设计一个具有共享逻辑的跨平台应用程序。 在我的整个应用程序中,我有一个固定的工具栏,该工具栏的顶部显示当前视图的标题以及一个按钮。栏下方的界面在视图之间发生了变化

Android部分:

在Android上,我创建了一个可重用的布局,并使用include将其嵌入到当前布局中。

在我的便携式项目中,我有一个BaseViewModel,它具有可重复使用的工具栏布局绑定到的属性。其他所有ViewModel都从该基类派生。这样,我可以在一个ViewModel中具有显示屏幕的所有可绑定属性,而无需嵌套,但自己动手做:

activity_login.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar_login" />
    <RelativeLayout
        android:id="@+id/parentLoginLayout"
        android:clickable="true"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/toolbar">
            <EditText
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:MvxBind="Text Pin"
                 />

    </RelativeLayout>
</RelativeLayout>

toolbar_login.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar_login"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    android:elevation="0dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    android:minWidth="25px"
    android:minHeight="25px">
    <TextView
        app:MvxBind="Click ToolbarMenuCommand"
        />
    <!-- some other  -->
</android.support.v7.widget.Toolbar>

ViewModels.cs

using System.Threading.Tasks;
using Mobile.Helpers;
using ViewModels.Base;
using MvvmCross.Core.Navigation;
using MvvmCross.Core.ViewModels;
using Plugin.MessageBox;

namespace Mobile.ViewModels
{
    public abstract class BaseViewModel : MvxViewModel
    {
        protected void NavigateToMainView()
        {
            NavigateTo<MainViewModel>();
        }

        private readonly IMvxNavigationService _navigationService;
        protected BaseViewModel(IMvxNavigationService navigationService)
        {
            _navigationService = navigationService;
        }

        public IMvxCommand ToolbarMenuCommand => new MvxCommand(OnMenuButtonClick);
        protected abstract void OnMenuButtonClick();
    }

    public class LoginViewModel : BaseViewModel
    {
        private bool _menuVisibility;
        private string _pin;

        public LoginViewModel(IMvxNavigationService navigationService) : base(navigationService)
        {
        }

        public bool MenuVisibility
        {
            get => _menuVisibility;
            set => SetProperty(ref _menuVisibility, value);
        }

        public string Pin
        {
            get => _pin;
            set => SetProperty(ref _pin, value);
        }

        protected override void OnMenuButtonClick()
        {
            MenuVisibility = !MenuVisibility;
        }
    }
}

iOS部分:

我不确定如何在iOS上实现上述行为。我希望有人对我有一个好主意或一个好的示例项目,我可以看看。通常,如果我的想法在iOS上是不可能的,则重构ViewModel是没有问题的。

有关iOS项目的一些事实:

  • 使用情节提要,但单个.xib是独立的 彼此
  • 在我的.xib文件中,我使用自动布局约束进行定位和 完全调整大小

我已经有了一些想法(现在无法对其进行测试):

1。想法:

  • 使用上面的栏,约束以及 网点
  • 根据先前创建的文件创建每个新的xib设计

这意味着我需要调整每个视图,以防万一我决定更改工具栏上的内容,但到目前为止,我发现没有其他方法可以在没有两个不同的ViewController的情况下将.xib嵌入另一个.xib中。我还读到继承会导致网点出现问题。

2。想法

  • 每个.xib顶部都有一个空白视图,用作 工具栏
  • 具有一个基本的ViewController,它可以通过代码和 将其作为子级添加到容器视图,并绑定属性 来自BaseViewModel

在以前的iOS项目中,我注意到将视图添加到布局会导致自动布局出现问题。也许也不是一个好的解决方案?

3。想法

使用工具栏和下面的容器创建一个xib,并将其用作母版页,这可能意味着拥有具有工具栏属性的MasterViewModel和嵌套的ChildViewModel。 这可能是要走的路,但是我不得不承认我不知道什么是最好的方式(对于iOS和MVVMCross来说还很陌生)。

有人对我有一些有用的提示吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

据我了解,我认为您应该尝试使用ScrollView for iOS部分,并尝试从Android模仿ViewPager的行为。