Xamarin iOS无法在没有故事板和使用MVVMCross 7.0.0的情况下启动第一个视图控制器

nuypyhwy  于 2023-09-28  发布在  iOS
关注(0)|答案(1)|浏览(154)

在我将xamarin ios应用程序中的mvvmcross更新到v7.0.0后,我无法让它运行。它只是冻结在启动画面中,并没有启动第一个视图控制器。我检查了AppDelegate和安装文件,一切正常。视图控制器构造函数被命中,视图模型也被命中,但视图控制器中的ViewDidLoad方法没有被命中。

  1. [Register("AppDelegate")]
  2. [assembly: Preserve(typeof(MvxIosSetup<App>))]
  3. public partial class AppDelegate : MvxApplicationDelegate<MvxIosSetup<App>, App>
  4. {
  5. /// <summary>
  6. /// UIApplicationDelegate.Window doesn't really exist / work. It was added by Xamarin.iOS templates
  7. /// </summary>
  8. public new virtual UIWindow Window { get; set; }
  9. public AppDelegate() : base()
  10. {
  11. RegisterSetup();
  12. }
  13. public override void WillEnterForeground(UIApplication application)
  14. {
  15. FireLifetimeChanged(MvxLifetimeEvent.ActivatedFromMemory);
  16. }
  17. public override void DidEnterBackground(UIApplication application)
  18. {
  19. FireLifetimeChanged(MvxLifetimeEvent.Deactivated);
  20. }
  21. public override void WillTerminate(UIApplication application)
  22. {
  23. FireLifetimeChanged(MvxLifetimeEvent.Closing);
  24. }
  25. public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
  26. {
  27. Window = new UIWindow(UIScreen.MainScreen.Bounds);
  28. var setup = new Setup();
  29. setup.InitializePrimary();
  30. setup.InitializeSecondary();
  31. setup.PlatformInitialize(this, Window);
  32. var myFirstViewController = new LoginView();
  33. Window.RootViewController = myFirstViewController;
  34. var startup = Mvx.IoCProvider.Resolve<IMvxAppStart>();
  35. startup.Start();
  36. Window.MakeKeyAndVisible();
  37. SetupUiStyles();
  38. return true;
  39. }
  40. private void FireLifetimeChanged(MvxLifetimeEvent which)
  41. {
  42. var handler = LifetimeChanged;
  43. handler?.Invoke(this, new MvxLifetimeEventArgs(which));
  44. }
  45. public event EventHandler<MvxLifetimeEventArgs> LifetimeChanged;
  46. private void SetupUiStyles()
  47. {
  48. UINavigationBar.Appearance.TintColor = UIColor.Black;
  49. UIApplication.SharedApplication.StatusBarStyle = UIStatusBarStyle.Default;
  50. if (UIDevice.CurrentDevice.CheckSystemVersion(15, 0))
  51. {
  52. var appearance = new UINavigationBarAppearance()
  53. {
  54. BackgroundColor = UIColor.FromRGB(99, 183, 105),
  55. TitleTextAttributes = new UIStringAttributes() { ForegroundColor = UIColor.White }
  56. };
  57. UINavigationBar.Appearance.StandardAppearance = appearance;
  58. UINavigationBar.Appearance.CompactAppearance = appearance;
  59. UINavigationBar.Appearance.ScrollEdgeAppearance = appearance;
  60. }
  61. // Disable check for delegate in event registration: https://forums.xamarin.com/discussion/39470/installed-5-9-build-431-event-registration-is-overwriting-existing-delegate-error
  62. UIApplication.CheckForEventAndDelegateMismatches = false;
  63. }
  64. }
  1. public class Setup : MvxIosSetup<App>
  2. {
  3. public Setup()
  4. {
  5. }
  6. protected override IMvxApplication CreateApp()
  7. {
  8. return new App();
  9. }
  10. protected override IMvxIosViewPresenter CreateViewPresenter()
  11. {
  12. return new MvxIosViewPresenter(ApplicationDelegate, Window);
  13. }
  14. protected override void InitializeFirstChance()
  15. {
  16. base.InitializeFirstChance();
  17. }
  18. public override void InitializeSecondary()
  19. {
  20. Mvx.IoCProvider.RegisterType<LoginViewModel, LoginViewModel>();
  21. InitializeViewModelTypeFinder();
  22. base.InitializeSecondary();
  23. }
  24. protected override IMvxNameMapping InitializeViewModelTypeFinder()
  25. {
  26. var viewModelByNameRegistry = CreateViewModelByNameRegistry();
  27. var viewModelAssemblies = GetViewModelAssemblies();
  28. foreach(var assemly in viewModelAssemblies)
  29. {
  30. viewModelByNameRegistry.AddAll(assemly);
  31. }
  32. var nameMapping = CreateViewToViewModelNaming();
  33. Mvx.IoCProvider.RegisterSingleton(nameMapping);
  34. return nameMapping;
  35. }
  36. }
  1. public class BaseView<T> : MvxViewController where T : MvxViewModel
  2. {
  3. protected BaseView(string name, NSBundle bundle = null)
  4. {
  5. }
  6. public new T ViewModel
  7. {
  8. get
  9. {
  10. return base.ViewModel as T;
  11. }
  12. set
  13. {
  14. base.ViewModel = value;
  15. }
  16. }
  17. public override void ViewDidLoad()
  18. {
  19. base.ViewDidLoad();
  20. }
  21. }
  1. [MvxRootPresentation]
  2. public partial class LoginView : BaseView<LoginViewModel>, IBaseView
  3. {
  4. public LoginView()
  5. : base("LoginView", null)
  6. {
  7. // being hit
  8. }
  9. public override void ViewDidLoad()
  10. {
  11. base.ViewDidLoad();
  12. //not being hit
  13. }
  14. }

我试了上面的代码和其他东西。有时ViewModel没有绑定到View(DataContext null)其他时间集。Apply()得到错误。但当它工作时,LoginView不显示,应用程序冻结在启动屏幕上

9fkzdhlc

9fkzdhlc1#

谢谢Cheesebaron。我在阅读你的评论之前就知道错了,但你是对的。
这是我最后一个FinishedLaunching方法,没有Window。
var startup = Mvx.IoCProvider.Resolve();
int findDuplicate();

  1. public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
  2. {
  3. Window = new UIWindow(UIScreen.MainScreen.Bounds);
  4. Window.RootViewController = new UINavigationController();
  5. var result = base.FinishedLaunching(application, launchOptions);
  6. SetupUiStyles();
  7. return result;
  8. }
  1. public class Setup : MvxIosSetup<App>
  2. {
  3. protected override void InitializeFirstChance()
  4. {
  5. base.InitializeFirstChance();
  6. Mvx.IoCProvider.RegisterType<IMvxJsonConverter, MvxJsonConverter>();
  7. }
  8. protected override void InitializeLastChance()
  9. {
  10. base.InitializeLastChance();
  11. }
  12. protected override IMvxIocOptions CreateIocOptions()
  13. {
  14. return new MvxIocOptions
  15. {
  16. PropertyInjectorOptions = MvxPropertyInjectorOptions.MvxInject
  17. };
  18. }
  19. }

MVVMCross 6.4.x及更高版本(6.4.2、7.0.0 -我测试过)的设置文件不需要CreateApp方法
而我的基本ViewController和ViewControllers,则不需要有构造函数,因为我没有使用故事板

  1. public class BaseView<T> : MvxViewController<T> where T : MvxViewModel
  2. {
  3. //no constructor
  4. }
  1. [MvxRootPresentation]
  2. public partial class LoginView : BaseView<LoginViewModel>, IBaseView
  3. {
  4. public LoginView()
  5. {
  6. //no base reference like before
  7. }
  8. }

最后,我从LoginView中删除了一些NavigatorController,我们曾经在那里设置了一些属性

展开查看全部

相关问题