从自定义UITableViewCell中的UITextFields中检索值

时间:2011-01-26 02:58:23

标签: iphone objective-c ios xamarin.ios

我发誓我已经在整个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的所有行(我现在理解这可能是不可能的)

所以,如果有人能够对我目前的方法有所了解,是否可行,或者我是否应该考虑重新实施整个事情。

2 个答案:

答案 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子视图。

不重复使用单元格是个坏主意,因为您可能在选择,附件视图等方面遇到问题。