菜鸟教程小白 发表于 2022-12-12 15:12:42

ios - MvxViewModelRequest 在 ViewDidLoad 中为空


                                            <p><p>我在 iPad 项目中使用 MvvmCross 3.0.12。目前,我在 MvxViewControllerExtensionMethods.LoadViewModel 中得到一个 NPE,因为 touchView.Request 为空。这只发生在从 MvxTableViewController 继承的 ViewController 中;从 MvxViewController 继承的 ViewController 可以正常加载和显示。 </p>

<p>我在 MvxTouchViewsContainer.CreateView -> MyTableViewController.Ctor -> MvxBaseTouchViewPresenter.Show -> MyTableViewController.LoadView 中设置了断点;它们都引用了该类的相同实例。然后,当我在 ViewDidLoad 中遇到断点时,它是一个新实例,并且包括 Request 在内的所有属性都为空。</p>

<p>这是 Xamarin.iOS 的错误还是我做错了什么?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这有时会发生在表格、标签栏和集合等 ViewController 上。</p>

<p>我认为,这是由于 Objective C 基类 <code>init</code> 中的某些内容引用了 <code>View</code> - 并因此在 C# 之前触发了 <code>ViewDidLoad</code> build 完全完成。这有点像在“纯”c# 中如果基类构造函数引用虚方法会发生的情况。</p>

<p>要检查您的应用是否发生这种情况,请在您的应用中放置 2 个断点 - 一个在 ViewController 构造函数中,一个在 ViewDidLoad 中 - 如果首先触发 ViewDidLoad,那么您就知道是这种情况。</p>

<p>我发现解决这个问题的唯一方法是通过在构造函数中触发第二个 ViewDidLoad 调用来编写代码。</p>

<pre><code>    public FirstView()
    {
      // need this additional call to ViewDidLoad because UIkit creates the view before the C# hierarchy has been constructed
      ViewDidLoad();
    }

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

      if (ViewModel == null)
            return;

      // ...
</code></pre>

<hr/>

<p>如果有帮助:</p>

<ul>
<li>我相信我至少在 N+1 次(也许 N=25 次)中讨论过这个问题 - 请参阅 <a href="https://github.com/MvvmCross/NPlus1DaysOfMvvmCross/blob/master/N-25-Tabbed/Tabbed.Touch/Views/FirstView.cs" rel="noreferrer noopener nofollow">https://github.com/MvvmCross/NPlus1DaysOfMvvmCross/blob/master/N-25-Tabbed/Tabbed.Touch/Views/FirstView.cs</a>和 <a href="http://mvvmcross.wordpress.com" rel="noreferrer noopener nofollow">http://mvvmcross.wordpress.com</a> </li>
<li>在纯客观 C 代码中也会发生相同类型的事情 - 例如参见 <a href="https://stackoverflow.com/questions/5620990/initialize-uitableviewcontroller-with-super-initwithstyleuitableviewstylegroup" rel="noreferrer noopener nofollow">initialize UITableViewController with </a> </li>
</ul></p>
                                   
                                                <p style="font-size: 20px;">关于ios - MvxViewModelRequest 在 ViewDidLoad 中为空,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/19171216/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/19171216/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - MvxViewModelRequest 在 ViewDidLoad 中为空