繁体   English   中英

有没有一种很好的方法来模拟iOS中的Android片段模式?

[英]Is there a nice way to simulate Android's Fragment Pattern in iOS?

我们在我们的应用程序中使用MvvmCross。 在我们的Android应用中,我们使用NavigationDrawer作为菜单。 我们加载包含NavigationDrawer和ContentFrame HomeView。

<android.support.v4.widget.DrawerLayout >

    <!-- The main content view -->
    <FrameLayout android:id="@+id/content_frame" />

    <!-- The navigation drawer -->
    <ListView android:id="@+id/left_drawer" />

</android.support.v4.widget.DrawerLayout>

触发OnCreate()方法时,我们会根据数据库查询将AudioPlayerFragment加载到content_frame 在同一方法中,我们设置了一个监听器,等待用户单击导航抽屉中的ListItem之一。

protected override void OnCreate(Bundle bundle) {
   // do stuff to build the nav drawer
    _topDrawerList = FindViewById<MvxListView>(Resource.Id.left_drawer);
    _topDrawerList.ItemClick += (sender, args) = > SelectItem(args.Position, null);

    if(bundle == null)
        SelectItem(0, null);
}

private void SelectItem(int position, UserViewModel currentUser) {
    SupportFragmentManager.BeginTransaction()...
}

我们的应用程序运行良好,我喜欢HomeView是应用程序的唯一视图。 其他一切都是碎片。

在我们的Core库中,我们有一个ViewView的ViewModel,我们还为应用程序中的每个Fragment提供了一个ViewModel。 再次,这对我们来说很有用。

  • PCL
    • 的ViewModels
      • HomeViewModel
      • AudioPlayerViewModel < - vm for fragment
      • LoginFragmentViewModel < - vm for fragment
  • Droid.Ui
    • 片段
      • AudioPlayerFragment
      • LoginFragment
    • 查看
      • HomeView < - 只是一个容器查看作为应用程序的入口点。 其他一切都是碎片...立即加载AudioPlayerFragment。

现在我正在尝试构建一个匹配的iOS应用程序,但我无法弄清楚如何构建它。 本质上我喜欢完全相同的行为,其中HomeView是入口点,并且可以包含SlidingPanel位和某些形式的ContentFrame,其他“视图”可以加载到其中。

不幸的是,现在我已经有了这个愚蠢的MenuView来处理,还有一个相应的MenuViewModel ......我真的不想要。

  • PCL
    • 的ViewModels
      • HomeViewModel
      • AudioPlayerViewModel < - vm for fragment
      • LoginFragmentViewModel < - vm for fragment
  • 触摸UI
    • 查看
      • AudioPlayerView
      • HomeView
      • LoginView
      • MenuView < - UGLY !!!
    • 的ViewModels
      • MenuViewModel < - UGLY !!!

我真的不想为菜单创建自定义View / ViewModel。 我正在使用SlidingPanels作为导航抽屉的iOS“版本”,我看到的教程需要一个额外的View / ViewModel作为菜单。

有没有办法做到这一点并保持ViewModels的连续性,以便它们都可以在PCL中重用? 是否有一种很好的(阅读清洁)方式以类似于Android的方式构建布局结构?

已经有一些尝试提供由便携式代码驱动的统一用户界面。 在MvvmCross中,这些特别是由用户界面的MonoTouch.Dialog类型方法驱动。 一个这样的尝试/实验称为“自动视图” - 您可以在以下操作中看到它:

在此自动视图层下方,可以在Dialog级别的MvvmCross中轻松共享更多View代码 - 例如,请参阅https://github.com/MvvmCross/MvvmCross-Tutorials/tree/master/DialogExamples


然而......据说...迄今为止,大多数自动视图工作仍然专注于提供快速原型而不是完成的应用程序。 对于完整的丰富用户界面,大多数开发人员仍然提供自定义UI。

我根本无法绕过iOS UI。 与Android相比,我感觉非常陌生。

这并不罕见 - 大多数XAML开发人员比UIKit更快地采用AXML。 但是,如果您花一些时间构建一些UIView并使用UIViewController构建一些用户界面(页面),那么我认为您将很快得到UIKit的支持。 此外,我很有信心,一旦你开始看到像UIKit动画这样基于代码的力量,那么你甚至会开始坠入爱河!

您将能够重用View模型,但不能重用您的视图。 今天,PCL不提供对UI堆栈的访问,因此您无法拥有可移植视图。 有关更多详细信息, 请查看我们的测试人员撰写的博客文章如何使便携式类库为您工作

我已经确定的方法是使用MvxViewController作为我的应用程序的基本入口点。

public class HomeView: MvxViewController
{
    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        var myEntryFragement = new MyEntryFragment();
        Add(myEntryFragment);
    }
}

然后使用MvxView作为“碎片”

public class MyEntryFragment: MvxView // essentially a UIView
{

    private MyEntryViewModel _viewModel;
    public MyEntryFragment()
    {
        // manually construct the _viewModel (or alternatively inject it in the constructor)
        // setup all your UI controls in here
    }

}

然后我根据需要加载和卸载我的“片段”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM