1

编辑 2:如果您正在寻找类似问题的答案,请查看 Stuart 的答案和我对此的评论。

编辑:我实际上得到了一个Mono.Debugger.Soft.VMDisconnectedException. 我最近还安装了 Windows 8.1 和 Resharper(尽管 Resharper 现在已暂停)。

当我在我的 MVVMCross Xamarin iOS 应用程序中访问我的视图模型的一个非常简单的列表属性时,程序失败了。它大部分时间都不会退出:它就像在运行一样。模拟器黑屏,也不例外。如果我断点if (messagesViewModel != null) source.ItemsSource = messagesViewModel.Messages;然后输入messagesViewModel.Messages即时窗口,一切都会停止,所以我可以说它在这一行失败了。相反,如果我“跨过”,它永远不会移动到下一行。

当我在以下代码中切换此代码时,我遇到了类似的行为MvxTableViewSource

public override int RowsInSection(UITableView tableview, int section)
{
    return 1;
}

我的视图模型如下所示:

public class MessagesViewModel : MvxViewModel
{
    private List<BaseMessage> _messages = null;

    public List<BaseMessage> Messages
    {
        get
        {
            return _messages; //yes, I know I'm returning null
                              //I wasn't at first.
        }
    }

    public MessagesViewModel()
    {
    }
}

这是我在 MvxTableViewController 上的 ViewDIdLoad:

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

    var source = new MessagesTableViewSource(TableView);
    //was binding here, removed it for debug purposes

    //failure on second line here
    var messagesViewModel = ViewModel as MessagesViewModel;
    if (messagesViewModel != null) source.ItemsSource = messagesViewModel.Messages;

    TableView.Source = source;
    TableView.ReloadData();
}

一些初始化代码:

public class App : MvxApplication
{
    public App()
    {
        var appStart = new MvxAppStart<MessagesViewModel>();
        Mvx.RegisterSingleton<IMvxAppStart>(appStart);
    }
}

public partial class AppDelegate : MvxApplicationDelegate
{
    //empty functions removed.

    public override bool FinishedLaunching(UIApplication app, NSDictionary options)
    {
        Window = new UIWindow(UIScreen.MainScreen.Bounds);

        var presenter = new MvxTouchViewPresenter(this, Window);

        var setup = new Setup(this, presenter);
        setup.Initialize();

        var startup = Mvx.Resolve<IMvxAppStart>();
        startup.Start();

        Window.MakeKeyAndVisible();

        return true;
    }
}
4

1 回答 1

1

我怀疑无论错误是什么,它都不在您发布的任何代码中。

我刚刚创建了一个简单的 ViewModel:

public class FirstViewModel 
    : MvxViewModel
{
    private List<string> _items = new List<string>() { "One", "Two", "Three"};
    public List<string> Items 
    {   
        get { return _items; }
        set { _items = value; RaisePropertyChanged(() => Items); }
    }
}

和一个简单的视图:

[Register("FirstView")]
public class FirstView : MvxTableViewController
{
    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        // ios7 layout
        if (RespondsToSelector(new Selector("edgesForExtendedLayout")))
           EdgesForExtendedLayout = UIRectEdge.None;

        var firstViewModel = ViewModel as FirstViewModel;
        var source = new MessagesTableViewSource(TableView);
        source.ItemsSource = firstViewModel.Items;
        TableView.Source = source;
    }

    public class MessagesTableViewSource : MvxTableViewSource
    {
        public MessagesTableViewSource(UITableView tableView) : base(tableView)
        {
            tableView.RegisterClassForCellReuse(typeof(MessagesCell), new NSString("MessagesCell"));
        }

        protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
        {
            return tableView.DequeueReusableCell("MessagesCell");
        }
    }

    public class MessagesCell : MvxTableViewCell
    {
        public MessagesCell(IntPtr handle)
            : base(handle)
        {
            var txt = new UILabel(new RectangleF(0, 0, 320, 44));
            Add(txt);
            this.DelayBind(() =>
                {
                    this.CreateBinding(txt).Apply();
                });
        }
    }
}

这段代码运行良好......


我不会完全相信 Xamarin.iOS 与即时窗口的集成 - 它现在比以前更好,但我之前已经看到了几个问题。

一些可能需要检查的事情:

  • 上面的代码对你有用吗?
    • 如果确实如此,那么您BaseMessageMessagesTableViewSource班级中的内容是什么-也许是它们引起了问题?
  • 你可以Mvx.Trace("The list is {0}", messagesViewModel.Messages ?? "-null")用来查看列表吗?您可以在 ViewModel 属性中使用跟踪get- 它被调用了吗?您可以在 ViewModel 构造函数中使用跟踪吗?
  • 您的所有程序集都是针对相同版本的事物构建的吗?您的所有组件都确定重建了吗?(检查“构建|配置管理器”)- 您在 VS 和 Mac 中运行的是哪个版本的 Xamarin.iOS?
于 2013-10-21T14:35:20.787 回答