我发誓我已经在整个Google数据库中搜索了一个可能的解决方案,但我仍然坚持这个问题:)
基本上,我在数据库表中有12行,我在其中生成一个带有4个UITextField的自定义UITableViewCell。表格列如下所示(SQLITE)
EntryFieldID NUMBER
Description TEXT
FieldType TEXT
现在我希望每个UITableViewCell
标记都是上面的EntryFieldID
,这样我以后可以轻松地将其引用到另一个表中。那张桌子看起来像这样。
OrderID NUMBER
EntryFieldID NUMBER
Value1 TEXT
Value2 TEXT
Value3 TEXT
Value4 TEXT
4个值*字段是每个UITextFields
内的4个UIViewCell
。
希望到目前为止这是有道理的:)
现在我的 TableViewSource 里面有这段代码:
protected List<InfoCaptureTableViewGroup> _tableItems;
protected string _customCellIdentifier = "InfoCaptureField";
protected Dictionary<int, InfoCaptureTableViewCell> _cellControllers = new Dictionary<int, InfoCaptureTableViewCell>();
public InfoCaptureTableSource (List<InfoCaptureTableViewGroup> items)
{
this._tableItems = items;
}
/// <summary>
/// Called by the TableView to determine how many sections(groups) there are.
/// </summary>
public override int NumberOfSections (UITableView tableView)
{
return this._tableItems.Count;
}
/// <summary>
/// Called by the TableView to determine how many cells to create for that particular section.
/// </summary>
public override int RowsInSection (UITableView tableview, int section)
{
return this._tableItems[section].Items.Count;
}
/// <summary>
/// Called by the TableView to retrieve the header text for the particular section(group)
/// </summary>
public override string TitleForHeader (UITableView tableView, int section)
{
return this._tableItems[section].Name;
}
/// <summary>
/// Called by the TableView to retrieve the footer text for the particular section(group)
/// </summary>
public override string TitleForFooter (UITableView tableView, int section)
{
return this._tableItems[section].Footer;
}
/// <summary>
/// Called by the TableView to retreive the height of the row for the particular section and row
/// </summary>
public override float GetHeightForRow (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
{
return 44f;
}
public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
{
// is there a way to NOT reuse cells? There's only ever going to be 12 of them
UITableViewCell cell = tableView.DequeueReusableCell (this._customCellIdentifier);
InfoCaptureTableViewCell customCellController = null;
InfoCaptureField item = this._tableItems[indexPath.Section].Items[indexPath.Row];
//---- if there are no cells to reuse, create a new one
if (cell == null)
{
customCellController = new InfoCaptureTableViewCell();
// retrieve the cell from our custom cell controller
cell = customCellController.Cell;
// disable selection
cell.SelectionStyle = UITableViewCellSelectionStyle.None;
// This is where I'd like to use the EntryFieldID
cell.Tag = Environment.TickCount;
// store our controller with the unique ID we gave our cell
this._cellControllers.Add (cell.Tag, customCellController);
}
else
{
// retrieve our controller via it's unique ID
customCellController = this._cellControllers[cell.Tag];
}
//---- return the custom cell
return cell;
}
上面的代码对我来说实际上并没有多大意义,它是从MonoTouch示例中复制的。我知道单元格被重用但我实际上想要避免这种情况,所以我可以使用EntryFieldID作为自定义单元格的Tag属性,以便我可以循环遍历UITableView的所有行(我现在理解这可能是不可能的)
所以,如果有人能够对我目前的方法有所了解,是否可行,或者我是否应该考虑重新实施整个事情。
答案 0 :(得分:7)
如果您不认为UITableViewCells是用于保存状态的应用程序的构建块,那么您将自己做一件大事,但它们是什么:根据需要创建和销毁的瞬态对象以呈现信息。
如果你在思考UITableViewCell方面实现了这一飞跃,你会发现,无论在任何特定控件或数据结构的变化方面发生什么,都需要反映在其他地方。
您对代码的第一个问题是您按照预期的方式使用单元格:通过重用队列中的现有单元格,然后您确定这不是您想要的并且您正试图使用不同的查找系统。这就是为什么你的方法不起作用的原因。
您有几个选择:
(a)按照应该使用的方式使用UITableViewCells。这可能很烦人,但是有一些工具可以让它变得更简单,比如MonoTouch.Dialog,或者你可以查看关于uitableviewcells设计模式的博客文章:
http://tirania.org/monomac/archive/2011/Jan-18.html
(b)您可以不在代码中重复使用相同的单元格标识符,而是为每一行使用一个单元格标识符。这将强制UITableView创建新单元格,每行一个,以后要查找。如果您将拥有12行,那么这应该没问题。
答案 1 :(得分:1)
最好的方法是不实现自己的单元格视图,而只是实现自定义视图并将其作为子视图添加到单元格的contentView中。
因此,每当您访问GetCell时,您必须使用自定义的子视图替换contentView子视图。
不重复使用单元格是个坏主意,因为您可能在选择,附件视图等方面遇到问题。