2011-01-26 1 views
2

を取得します私は内部に4つのUITextFieldsを持つカスタムUITableViewCellを生成します。表の列は、この(SQLiteの)は、私は可能な解決策のための全体Googleのデータベースを検索したが、私はまだこの問題にこだわって:)</p> <p>基本的に、私はデータベースのテーブルに12行を持って誓うカスタム内側UITextFieldsからの値のUITableViewCell

EntryFieldID NUMBER 
Description TEXT 
FieldType TEXT 

のように見える今、私は、各UITableViewCellタグはので、私は簡単に別のテーブルに格納するために戻って後で参照することができます上記EntryFieldIDになりたいです。そのテーブルはこのように見えます。

OrderID  NUMBER 
EntryFieldID NUMBER 
Value1  TEXT 
Value2  TEXT 
Value3  TEXT 
Value4  TEXT 

4値*フィールドは、各UIViewCell内側にある4 UITextFieldsあります。

がうまくいけば、これはこれまでに理にかなって:)今

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の例からコピーされました。私はセルが再利用されることを理解していますが、実際にはこれを避けたいので、カスタムセルのTagプロパティにEntryFieldIDを使用することができ、UITableViewのすべての行をループすることができます。 。

誰かが私の現在のアプローチについて、それが実現可能であろうとなかろうと、それを全面的に再実装することを検討する必要があるかどうかについて、いくつか明示することができれば。

+0

あなたはGoogleのデータベースにアクセスできますか?私はあなたを羨ましい;) –

+0

私たちはすべて@ケットラーをしています:) – Marko

答えて

7

、あなたのアプリケーションのためのビルディングブロックとしてUITableViewCellsを考慮していない場合は、自分自身に大きな恩恵を行うだろうというホールド状態ではなく、情報のレンダリングのために必要に応じて作成および破棄される一時的なオブジェクトです。

UITableViewCellについて考えてみると、特定のコントロールやデータ構造の変更に関してセルで何が起こっても、どこか他の場所に反映される必要があることに気づくでしょう。

コードでの最初の問題は、使用する予定のとおりにセルを使用していることです。既存のセルをキューから再利用して、それがあなたが望むものではないと判断し、別の検索システムを使用しようとしています。そういうわけで、あなたのアプローチは動かないのです。

あなたは、いくつかのオプションがあります。

(a)の使用UITableViewCellsそれらが使用されることを想定している方法を。これは厄介なことかもしれませんが、これをMonoTouchのようにもっとシンプルにするツールがあります。ダイアログまたはあなたがuitableviewcellsのためのデザインパターンの私のブログのエントリをチェックすることができます。

http://tirania.org/monomac/archive/2011/Jan-18.html

(b)にあなたが代わりにあなたのコード内で同じセル識別子を再利用する、行ごとに一つのセル識別子を使用することができます。これにより、UITableViewは後でルックアップする行ごとに新しいセルを作成します。あなたが持っているすべての行が12行の場合、これは問題ありません。

+0

UITableViewに関する素晴らしい情報をありがとう...私はちょうどあなたのブログの記事を読んで、私は私の問題に完全に間違ったアプローチを取ったことを理解した。私がよく理解していないのは、各行にセル識別子を使用するという答えの2番目の選択肢です。 UITableViewは新しいセルを作成すると言いますが、これは他のセルを表示するためにスクロールするときにテキストフィールドに入力された情報が失われることを意味しますか?また、カスタムUITableViewCellの代わりにカスタムビューを作成し、ScrollViewを使用して表示することもできます。 – Marko

+0

セルごとに1つの識別子を使用する場合、「デキュー」すると常に同じセルのデキューが行われるため、格納した値はそのまま残ります。 –

+0

ありがとう@miguel - どのようなコードがどのように見えるだろうか? 'InfoCaptureFieldID'をセルの' TAG'として追加しようとしましたが、 '同じキーを持つ要素が辞書にすでに存在しています。 ' – Marko

1

自分のセルビューを実装するのではなく、カスタムビューを実装してセルのcontentViewにサブビューとして追加するのが最も良い方法です。

GetCellにアクセスするたびに、contentViewサブビューをカスタムカスタムビューに置き換える必要があります。

おそらく選択、アクセサリビューなどに問題があります原因ではないセルを再利用することは悪い考えでは、ある

+0

私は@マックスに従っていません - あなたの最初の段落を精緻化できますか?選択、アクセサリビューの問題については、このテーブルには必要ありません。 – Marko

+0

すべてのセルに対してセルコントローラを作成するのは良い考えではありません。ここでユーザーとのやりとりが必要ない場合は、特にビューの表示とコントローラーの表示が必要です。 – Max

+0

私はこのサイト(http://simon.nureality.ca/?p=91)の例を使用しましたが、すべてが完全に機能しています。テキストボックスに値を追加すると計算がいくつか起きるので、私はセルコントローラが必要です...まだ、これらの値をどのように取得しますか? – Marko

関連する問題