为什么MonoTouch.Dialog对某些元素选项使用公共字段,而对其他元素选项使用公共属性
本文关键字:选项 元素 其他 属性 字段 MonoTouch 为什么 Dialog | 更新日期: 2023-09-27 18:31:10
我正在尝试在设置DVC后设置StringElement的"值"时在UI中更新。
例如:
public partial class TestDialog : DialogViewController
{
public TestDialog() : base (UITableViewStyle.Grouped, null)
{
var stringElement = new StringElement("Hola");
stringElement.Value = "0 Taps";
int tapCount = 0;
stringElement.Tapped += () => stringElement.Value = ++tapCount + " Taps";
Root = new RootElement("TestDialog")
{
new Section("First Section")
{
stringElement,
},
};
}
}
但是,StringElement.Value 只是一个公共字段,只有在初始化期间调用 Element.GetCell 时才会写入 UICell。
为什么它不是一个属性,在资源库中有逻辑来更新UICell(就像大多数元素一样,例如EntryElement.Value):
public string Value
{
get { return val; }
set
{
val = value;
if (entry != null)
entry.Text = value;
}
}
编辑:
我制作了自己的StringElement
版本,派生自Element
(基本上只是逐字复制了这里的源代码)
然后我将其更改为对 GetCell
中创建的单元格的类范围引用,而不是函数作用域。然后将Value
字段更改为属性:
public string Value
{
get { return val; }
set
{
val = value;
if (cell != null)
{
// (The below is copied direct from GetCell)
// The check is needed because the cell might have been recycled.
if (cell.DetailTextLabel != null)
cell.DetailTextLabel.Text = Value == null ? "" : Value;
}
}
}
它在初始测试中工作。但是,我不确定是否允许引用单元格,其他元素似乎都没有这样做(它们只引用放置在单元格内的控件)。是否有可能基于一个MonoTouch.Dialog.Element
实例创建多个"活动"*单元?
*我说实时以指示当前属于活动 UI 的单元格。我确实注意到,从子对话框导航回对话框时,会再次调用 GetCell 方法,并基于 Element 创建一个新单元格,但这仍然是元素和活动单元格之间的 1-1。
对于主要问题:
为什么 MonoTouch.Dialog 对某些元素选项使用公共字段,而对其他选项使用公共属性?
我已经浏览了代码,我认为使用它们都没有一致的理由。
Dialog项目最初不是MonoTouch项目的一部分 - 我不认为Miguel知道当他开始编写和发展它时它会有多大用处 - 我认为他当时更专注于编写其他应用程序,如TweetStation。
我知道有几个人(包括我!)已经分支了代码并根据他们的目的对其进行了调整。我猜在将来的某个时候,Xamarin可能会编写一个具有更严格编码标准的2.0版本。
参考活细胞
对于有限的使用,您可以这样做...但一般来说不会。
表视图的思想是,当用户上下滚动时,单元格会被重用 - 特别是为了节省内存和 UI 资源。由于这是一个很长的列表,因此多个元素可能会获得对同一单元格的引用。
如果您确实想要缓存单元格引用,那么您可能应该覆盖 GetCell(),以便它永远不会尝试重用现有单元格(从不调用 DequeueReusableCell)
或者,您可以尝试更改基元素类中的一些代码,以确定元素是否具有当前附加的单元格 - 这就是 CurrentAttachedCell 在我的对话框 https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross.Dialog/Dialog/Elements/Element.cs 分支中所做的(但该分支还有其他添加的函数和依赖项,因此您可能不想将其用于当前工作!