【问题标题】:SideMenu for mvvmCrossmvvmCross 的 SideMenu
【发布时间】:2017-10-20 18:25:39
【问题描述】:

想为Xamarin.iOS 应用程序实现侧边菜单,但在控制台中收到警告:

mvx:Warning: 0.25 未找到侧边菜单。使用侧边菜单装饰 具有“MvxPanelPresentationAttribute”类的视图控制器类 并将面板设置为“左”或“右”。

步骤

1) 为菜单创建基类(来自sample

public class BaseMenuViewController<T> : MvxViewController<T>, IMvxSidebarMenu where T : class, IMvxViewModel
{
    public virtual UIImage MenuButtonImage => UIImage.FromBundle("burger");

    public virtual bool AnimateMenu => true;
    public virtual float DarkOverlayAlpha => 0;
    public virtual bool HasDarkOverlay => false;
    public virtual bool HasShadowing => true;
    public virtual bool DisablePanGesture => false;
    public virtual bool ReopenOnRotate => true;

    private int MaxMenuWidth = 300;
    private int MinSpaceRightOfTheMenu = 55;

    public int MenuWidth => UserInterfaceIdiomIsPhone ?
        int.Parse(UIScreen.MainScreen.Bounds.Width.ToString()) - MinSpaceRightOfTheMenu : MaxMenuWidth;

    private bool UserInterfaceIdiomIsPhone
    {
        get { return UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone; }
    }

    public virtual void MenuWillOpen()
    {
    }

    public virtual void MenuDidOpen()
    {
    }

    public virtual void MenuWillClose()
    {
    }

    public virtual void MenuDidClose()
    {
    } 
}

2) 实现 VisibleView(第一个可见的)

[MvxSidebarPresentation(MvxPanelEnum.Center, MvxPanelHintType.ResetRoot, true)]
public partial class ContentViewController : MvxViewController<ContentViewModel>
{
    public ContentViewController()
        : base("ContentViewController", null)
    {
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        View.BackgroundColor = UIColor.Purple;
        this.ViewModel.Show<MenuViewModel>();
    }
}

3) 实现 MenuElementViewController (SideMenu)

[Register("MenuViewController")]
[MvxSidebarPresentation(MvxPanelEnum.Left, MvxPanelHintType.PushPanel, false)]
public class MenuViewController : BaseMenuViewController<MenuViewModel>
{
    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        this.View.BackgroundColor = UIColor.Red;
    }
}

4) 在设置中为 SideMenu 添加演示者

protected override IMvxIosViewPresenter CreatePresenter()
{
    return new MvxSidebarPresenter((MvxApplicationDelegate)ApplicationDelegate, Window);
}

预期行为

应该从点 1 看到带有汉堡按钮的控制器

实际行为

从 point1 开始的控制器变得可见但没有汉堡按钮, 来自 point2 的控制器未初始化, 控制台中关于错过课堂装饰的警告,但正如您所见,它们存在(也已弃用警告并需要更新 - check source code - searching done for correct type, but warning has old message

配置

MvvmCross v 5.0.6

  • MvvmCross
  • MvvmCross.Core
  • MvvmCross.Binding
  • MvvmCross.iOS.Support
  • MvvmCross.iOS.Support.XamarinSidebar
  • MvvmCross.Platform
  • 侧边栏导航

在查找错误时还看到了this post - 重新检查,看起来一切正常,但不起作用。

警告日志:

mvx:Diagnostic: 0.21 Setup: Secondary end

mvx:Diagnostic: 0.21 显示 ViewModel ContentViewModel iOSNavigation:诊断:0.21 导航请求

mvx:Warning: 0.23 未找到侧边菜单。要使用侧边菜单,请使用“MvxPanelPresentationAttribute”类装饰视图控制器类,并将面板设置为“左”或“右”。

我还希望在调用this.ViewModel.Show&lt;MenuViewModel&gt;(); 时看到ViewDidload 的断点停止在MenuViewController 但它从未被触发,在创建此控制器的同一时刻模型。

有人可以建议做错了什么吗?


编辑

我能够设置 new empty project with sidebar 并且它按预期工作。但是相同的代码在我当前的项目中不起作用 - 我不知道为什么装饰属性没有按预期读取....

【问题讨论】:

    标签: c# iphone xamarin.ios mvvmcross


    【解决方案1】:

    该跟踪是由MvxSidebarViewController 中的这段代码触发的。

        protected virtual void SetupSideMenu()
        {
            var leftSideMenu = ResolveSideMenu(MvxPanelEnum.Left);
            var rightSideMenu = ResolveSideMenu(MvxPanelEnum.Right);
    
            if (leftSideMenu == null && rightSideMenu == null)
            {
                Mvx.Trace(MvxTraceLevel.Warning, $"No sidemenu found. To use a sidemenu decorate the viewcontroller class with the 'MvxPanelPresentationAttribute' class and set the panel to 'Left' or 'Right'.");
                AttachNavigationController();
                return;
            }
    
            // ...
        }
    

    因此,Mvvmcross 无法解析标有您在上面使用的属性的 SideMenu 视图控制器。我建议删除所有 MvvmCross nugets 并删除 binobj 文件夹。

    可能尝试将构造函数添加到 MenuViewController 可能会有所帮助。

    如果一切都失败了,我会尝试在测试项目中完全按照它们的方式构建类,我注意到您的 ContentViewController 不像在项目中那样从基类继承。我知道这不应该真正相关,但我从侧边栏类的实验中发现,ViewControllers 和嵌套视图控制器的设置非常特殊。

    我完全取消了 MvvmCross 侧边栏 nuget,直接使用了 XamarinSidebar nuget,我使用 MvxSidebarViewController 作为起点来创建自己的实现,我不是特别热衷于属性设置,我喜欢处理自己导航而不是使用ShowViewModel 或新的导航系统。

    希望对你有所帮助。

    【讨论】:

    • 谢谢 - 我已经尝试删除/添加/更新重新安装库,重新创建所有类,重命名,清理,删除 bin/ 和 obj/ 文件夹,完全清理项目 - 结果每次都一样... .在同一时刻,我在单独的项目中复制粘贴代码,它就可以工作了..看起来装饰属性检测有问题(请参阅我的编辑示例链接)
    • 还添加/删除构造函数,直接从 Mvx 类中继承子类无济于事
    • 有趣的可能是一个 Xamarin 错误,尝试谷歌搜索属性检测。
    • 已经开始...如果我找到根本原因 - 我会在这里发布,谢谢(老实说对 c# 不太熟悉)
    • 如果所有其他方法都失败了,您可以按照我的做法并使用 XamarinSidebar nuget 进行自己的实现。
    【解决方案2】:

    花 2 天时间找出原因 - 与检测和解析装饰器属性相关的问题。

    由于某些原因,我很少有项目在彼此之间共享代码库 [MvxSidebarPresentation(MvxPanelEnum.Left, MvxPanelHintType.PushPanel, false)] 如果它放在共享项目中而不是项目本身中,则不考虑在内。同一时间

    [MvxSidebarPresentation(MvxPanelEnum.Center, MvxPanelHintType.ResetRoot, true)]
    [MvxSidebarPresentation(MvxPanelEnum.Center, MvxPanelHintType.ResetRoot, true, MvxSplitViewBehaviour.Master)]
    [MvxSidebarPresentation(MvxPanelEnum.Center, MvxPanelHintType.PushPanel, true, MvxSplitViewBehaviour.Detail)]
    

    按预期工作。

    解决方法 -> 在应该使用它的每个项目中子类共享 menuClass(使用 MvxPanelEnum.Left)。

    不确定此问题是否与 mvvmCross lib 或 Xamarin 有关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 2017-01-04
      • 2019-05-04
      相关资源
      最近更新 更多