iOS-эквивалент для Android включает контроль - PullRequest
0 голосов
/ 06 июля 2018

Я разрабатываю кроссплатформенное приложение для 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).

У кого-нибудь есть несколько полезных советов для меня?Большое спасибо!

1 Ответ

0 голосов
/ 06 июля 2018

Из того, что я понял, я думаю, что вы должны попытаться использовать часть ScrollView для iOS и попытаться подражать поведению ViewPager из Android, например.

...