Я разрабатываю кроссплатформенное приложение для iOS, а также Android с общей логикой, используя MVVMCross (5.1.1).Во всем приложении у меня есть фиксированная панель инструментов, отображающая заголовок текущего представления, а также кнопку.Под панелью интерфейс меняется от вида к виду
Часть 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.Я надеюсь, у кого-то есть хорошая идея или хороший пример проекта для меня, на который я могу взглянуть.В общем, нет проблем в рефакторизации ViewModels, если моя идея просто невозможна для iOS.
Несколько фактов о проекте iOS:
- Я не с использованием раскадровок, но отдельные файлы .xib независимы друг от друга
- В моих файлах .xib я использую ограничения автоматического размещения для полного позиционирования и определения размера
Несколько идей, которые у меня уже были (не могупроверьте их прямо сейчас):
1.идея:
- Создайте базовый .xib с вышеупомянутой полосой, ограничения также выводят
- Создайте каждый новый дизайн xib на основе ранее созданного файла
Это означало бы, что мне нужно настроить каждый просмотр, если я решу что-то изменить в панели инструментов, но до сих пор я не нашел другого способа встроить .xib в другой .xib без двух разных ViewControllers.Также я читал, что наследование вызывает проблемы с розетками.
2.idea
- Каждый .xib имеет пустой вид сверху, который выступает в качестве контейнера для панели инструментов
- Имеет базовый ViewController, который создает панель инструментов из кода и добавляет еекак дочерний элемент к представлению контейнера, и привязывает свойства из BaseViewModel
В предыдущем проекте iOS я заметил, что добавление представлений в макет может вызвать проблемы с автоматической разметкой.Возможно, не очень хорошее решение?
3.idea
Создайте xib с панелью инструментов и контейнером ниже и используйте ее в качестве главной страницы, что, вероятно, означало бы наличие MasterViewModel со свойствами панели инструментов и вложенного ChildViewModel.Это, вероятно, правильный путь, но я должен признать, что понятия не имею, как лучше всего к нему подойти (все еще довольно плохо знаком с iOS и MVVMCross).
У кого-нибудь есть несколько полезных советов для меня?Большое спасибо!