MvvmCross 6 中的子类 UIWindow

Posted

技术标签:

【中文标题】MvvmCross 6 中的子类 UIWindow【英文标题】:Subclass UIWindow in MvvmCross 6 【发布时间】: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 的方法,有什么建议吗?

谢谢

尼尔

【问题讨论】:

【参考方案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);这与您的相同,但方式略有不同。

以上是关于MvvmCross 6 中的子类 UIWindow的主要内容,如果未能解决你的问题,请参考以下文章

UIWindow 子类:Touches 事件不会被触发

在哪里可以将我的应用程序使用的窗口从 UIWindow 更改为我自己的带有情节提要的子类“MyWindow”?

MvvmCross 从 6.4.2 升级到 8.0.1

从 UIViewController 方法更改 UIWindow 的呈现视图

如何用MVVMCross 6.2设置标题标题?

MvvmCross 6.4.1 Mvx.IoCProvider.Resolve<IMvxAppStart>() 失败,找不到构造函数