MvvmCross / Xamarin“此类不是密钥值编码兼容的密钥”

我知道这个问题已被问了一百万次,但是我正在试图跟随Stuart Lodge的教程“N + 1天的MvvmCross”,N = 11,CollectionView。 因为我在观看教程时正在编辑另一个项目所以我没有跟随100%,因此我确信我错过了一些东西。 这是完整的错误消息:

Foundation.MonoTouchException: Objective-C exception thrown. Name: NSUnknownKeyException Reason: [ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key MyLabel. 

对于TestItemView的自动生成分部类,似乎有一个有效的出口

我不相信这是一个向xib添加控件然后删除它的情况,因此存在搁浅的连接。 当我删除xib并重新开始时会发生这种情况。 我有一个“FirstView:MvxCollectionViewController”,对于单元格,我有一个“TestItemView:MvxCollectionViewCell”,它是“KittenCollectionCell”的替身。 我将在下面给出FirstView,TestItemView和TestItemView.xib的源代码。

的firstView:

 using System.Drawing; using MvvmCross.Binding.BindingContext; using MvvmCross.iOS.Views; using Foundation; using MvvmCross.Binding.iOS.Views; using UIKit; namespace FirstDemo.Core.iOS.Views { [Register("FirstView")] public class FirstView : MvxCollectionViewController { private bool _isInitialized = false; public FirstView() : base(new UICollectionViewFlowLayout() { ItemSize = new SizeF(240, 400), ScrollDirection = UICollectionViewScrollDirection.Horizontal }) { _isInitialized = true; ViewDidLoad(); } public sealed override void ViewDidLoad() { if (!_isInitialized) return; base.ViewDidLoad(); //var source = new MvxStandardTableViewSource(TestItemsTableView, "TitleText Name;"); //TestItemsTableView.Source = source; CollectionView.RegisterNibForCell(TestItemView.Nib, TestItemView.Key); var source = new MvxCollectionViewSource(CollectionView, TestItemView.Key); CollectionView.Source = source; var set = this.CreateBindingSet(); set.Bind(source).To(vm => vm.TestItemViewModels); set.Apply(); CollectionView.ReloadData(); } } } 

这是对TestItemView的手工编码部分:

 using System; using FirstDemo.Core.ViewModels; using Foundation; using MvvmCross.Binding.BindingContext; using MvvmCross.Binding.iOS.Views; using UIKit; namespace FirstDemo.Core.iOS { public partial class TestItemView : MvxCollectionViewCell { public static readonly UINib Nib = UINib.FromName("TestItemView", NSBundle.MainBundle); public static readonly NSString Key = new NSString("TestItemView"); public TestItemView(IntPtr handle) : base(string.Empty /* TODO - this isn't really needed - mvx bug */, handle) { this.DelayBind(() => { var set = this.CreateBindingSet(); set.Bind(MyLabel).To(testItem => testItem.Name); set.Apply(); }); } public static TestItemView Create() { return (TestItemView)Nib.Instantiate(null, null)[0]; } } } 

这是自动生成的部分:

 // WARNING // // This file has been generated automatically by Xamarin Studio from the outlets and // actions declared in your storyboard file. // Manual changes to this file will not be maintained. // using Foundation; using System; using System.CodeDom.Compiler; using UIKit; namespace FirstDemo.Core.iOS { [Register ("TestItemView")] partial class TestItemView { [Outlet] [GeneratedCode ("iOS Designer", "1.0")] UILabel MyLabel { get; set; } [Outlet] [GeneratedCode ("iOS Designer", "1.0")] UIView TestItemInfo { get; set; } void ReleaseDesignerOutlets () { if (MyLabel != null) { MyLabel.Dispose (); MyLabel = null; } if (TestItemInfo != null) { TestItemInfo.Dispose (); TestItemInfo = null; } } } } 

最后,TestItemView臭名昭着的xib:

  

如果有人有线索,我会感谢你的帮助,因为我完全失去了。

谢谢!

我对快速的方法并不熟悉。 但是在objective-c中,您必须手动将插件对象从XIB添加到代码中。 当您的XIB视图链接到某个旧视图的地址时,将出现此错误。 所以在objective-c中,我们习惯于执行以下步骤。

  • 打开你的XIB
  • 搜索名称为MyLabel的标签
  • validation连接(它链接到哪个对象)
  • 如果需要,请删除sockets链接并再次添加。