gpt4 book ai didi

C# Xamarin - 使用 SetValueForKey 将数据绑定(bind)到 UICollectionViewCell

转载 作者:行者123 更新时间:2023-11-29 12:00:17 24 4
gpt4 key购买 nike

我在使用 Xamarin.iOS 时遇到严重问题。

我来自 MVC5 web 背景,经常将数据绑定(bind)到 DOM 元素(例如使用 JS data- 属性)。我想在 Xamarin.iOS 中实现类似的模式。

从我在 Xamarin 的文档中收集到的内容(它似乎总是基于框架的过时版本)我需要使用 KVC 模式将数据(但不显示)绑定(bind)到 UICollectionViewCell

是在我的 UpdateCell 方法中调用 SetValueForKey(NSObject object, NString key) 的最佳方法(注意:我已将参数更改为通用参数):

 public class MyClassCollectionViewCell : UICollectionViewCell 
{
[Outlet]
UILabel NameLabel { get; set; }

public BaseCell (IntPtr handle) : base (handle)
{
this.NameLabel = new UILabel();
}

public virtual void UpdateCell(MyClass myClassObject)
{
// Display the "Name" within the UILabel outlet
this.NameLabel.Text = myClassObject.Name;

// This being my custom cell which inherits from UICollectionViewCell
this.SetValueForKey(myClassObject, "BoundMyClassObject");

// remainder omitted for brevity
}
}

还有 MyClass.cs(同样,不是真实名称,只是为了说明)

public class MyClass 
{
[JsonProperty("Id")]
public int Id { get; set; }

[JsonProperty("Name")]
public string Name { get; set; }

// more props omitted for brevity
}

问题是我尝试绑定(bind)的对象不是从 NSObject 继承的,因此不能与 SetValueForKey 一起使用。

我希望将对象绑定(bind)到单元格,点击单元格,检索绑定(bind)到单元格的数据,最后使用绑定(bind)数据进行 REST 调用。

这是为什么?好吧,我希望“名称”MyClass 属性显示在 UICollectionViewCell 的标签上,并且“Id”可供 REST 调用访问但不显示给用户。目前标签显示 TapGesture 有效,但我无法检索 myClassObject.Id 的值,因此无法进行网络调用!

UITapGestureRecognizer 连接到我的 UICollectionViewController 中的 UICollectionView - 问题范围不需要代码)并且正确地触发一个事件但是需要键“BoundMyClassObject”或 myClassObject.Id 的值以 POST 为 JSON...

有道理吗?

请帮助我,因为 Xamarin 文档和论坛中的信息很少。

祝一切顺利

约翰

编辑

作为@AdamKemp在此处的帖子中指出,SetValueForKey 是针对 NSObject 的。

于是我重构了MyClass.cs中的代码如下

[注册("MyClass)] 公共(public)课我的课:NSObject { 公共(public) MyClass() { }

    public MyClass(int ID)
{
this.Id = ID;
}

private int _Id = 0;
[Export("Id")]
public int Id
{
get
{
return _Id;
}
set
{
WillChangeValue("Id");
_Id = value;
DidChangeValue("Id");
}
}

// same for Name property
}

但是,当我在 UpdateCell 方法中调用 SetValueForKey

 MyClass myClassObject = newMyClass(7); // int passed to constructor for illustration in my real code it's dynamic

this.SetValueForKey(myClassObject, "MyClassObject");

我遇到以下错误

Foundation.MonoTouchException: Objective-C exception thrown.  Name: NSUnknownKeyException Reason: [<UICollectionViewCell 0x7e433a30> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key MyClassObject.

最佳答案

好的,

我将以下属性添加到我的 UICollectionViewCell 类中:

[Export("Id")]
NSNumber Id { get; set; }
[Export("Name")]
NSString Name { get; set; }

并且还更改了传递给 SetValueForKey 的参数

this.SetValueForKey(new NSNumber(7), 
new NSString("Id"));

然后它将值 7 正确分配给此 UICollectionViewCell 的属性。请注意,您的属性必须全部使用 [Export] 进行修饰。

事实上,不再需要 MyClass.cs - 如果您将属性放在自定义 UICollectionViewCell 中并调用 SetValueForKey 来初始化它们。

然后可以使用

在任何地方读出它们
NSNumber instanceID = (NSNumber)cell.ValueForKey(new NSString("Id"));

然后您可以使用从此调用中检索到的数据,并根据需要传递给您的数据访问层。

顺便说一句,SetValueForKey 方法需要一个 NSObject(或其子对象)作为第一个参数。恼人的是 NSDate 可能会很痛苦,所以我制作了一个扩展方法,用于将 C# DateTime 转换为 NSDate 以便于数据绑定(bind):

public static NSDate DateTimeToNSDate(DateTime date)
{
return NSDate.FromTimeIntervalSinceReferenceDate((date - (new DateTime(2001, 1, 1, 0, 0, 0))).TotalSeconds);
}

public static DateTime NSDateToDateTime(NSDate date)
{
return (new DateTime(2001, 1, 1, 0, 0, 0)).AddSeconds(date.SecondsSinceReferenceDate);
}

最后看this有关数据绑定(bind)的更多信息的 Xamarin 教程。

我希望这对 future 的人有所帮助! (嗨, future 的人们 - 奇点出现了吗?)

关于C# Xamarin - 使用 SetValueForKey 将数据绑定(bind)到 UICollectionViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37301056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com