【问题标题】:Subclass UIWindow in MvvmCross 6MvvmCross 6 中的子类 UIWindow
【发布时间】:2019-01-11 12:43:22
【问题描述】:

在更新到 MvvmCross 6 之前,我们曾经在 iOS 上继承 UIWindow 并将其设置为 AppDelagate 中的 keywindow 以检测应用程序中的所有事件,我们过去使用 Setup 的方式现在在 MvvmCross 6.0 中发生了变化。

https://www.mvvmcross.com/mvvmcross-6.0.0-release/

应用开始

“应用程序以 MvvmCross 启动的方式现在变得更加简洁。MvxAppStart 现在由框架统一自动调用。这意味着您可以在 iOS 等平台上安全地删除初始化代码(框架现在还将创建您的关键窗口)。”

现在看不到设置自己的 keywindow 并将其传递给 MvvmCross 的方法,有什么建议吗?

谢谢

尼尔

【问题讨论】:

    标签: ios xamarin mvvmcross


    【解决方案1】:

    正如您所说,MvvmCross 6 现在负责为您分配 KeyWindow。 其实在阅读MvvmCross 6+的source code时,你可以在FinishedLanchingWithOptions中看到这个:

    public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
        {
            //window is being assigned here by MvvmCross
            if (Window == null)
                Window = new UIWindow(UIScreen.MainScreen.Bounds);
    
            MvxIosSetupSingleton.EnsureSingletonAvailable(this, Window).EnsureInitialized();
    
            RunAppStart(launchOptions);
    
            FireLifetimeChanged(MvxLifetimeEvent.Launching);
            return true;
        }
    

    但是,它们没有为您提供这样做的钩子。为了解决这个问题,我建议重写并执行以下操作:

    [Register(nameof(AppDelegate))]
    public class AppDelegate : MvxApplicationDelegate<Setup, Core.App>
    {
        public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
        {
            if (Window == null)
                Window = new CustomWindow(UIScreen.MainScreen.Bounds);
    
            base.FinishedLaunching(application, launchOptions);
        }
    
    }
    

    希望对你有帮助

    【讨论】:

    • 谢谢@wishmaster,是的,你是对的,我实际上有我自己的版本,以一种更复杂的方式,在你的回复之后,我将它剥离回本质上是公共覆盖 UIWindow Window { get ;放; } = new AppWindow(UIScreen.MainScreen.Bounds);这与您的相同,但方式略有不同。
    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2012-03-06
    相关资源
    最近更新 更多