我正在使用MVVMCross(5.1.1)为iOS和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上是不可能的,则重构ViewModel是没有问题的。
有关iOS项目的一些事实:
我已经有了一些想法(现在无法对其进行测试):
1。想法:
这意味着我需要调整每个视图,以防万一我决定更改工具栏上的内容,但到目前为止,我发现没有其他方法可以在没有两个不同的ViewController的情况下将.xib嵌入另一个.xib中。我还读到继承会导致网点出现问题。
2。想法
在以前的iOS项目中,我注意到将视图添加到布局会导致自动布局出现问题。也许也不是一个好的解决方案?
3。想法
使用工具栏和下面的容器创建一个xib,并将其用作母版页,这可能意味着拥有具有工具栏属性的MasterViewModel和嵌套的ChildViewModel。 这可能是要走的路,但是我不得不承认我不知道什么是最好的方式(对于iOS和MVVMCross来说还很陌生)。
有人对我有一些有用的提示吗?非常感谢!
答案 0 :(得分:0)
据我了解,我认为您应该尝试使用ScrollView for iOS部分,并尝试从Android模仿ViewPager的行为。