2011-03-28 16 views
0

それぞれがUITextFieldを含む12行のUITableViewを持っています。 デフォルトでは、UITextFieldには、ユーザーが以前にテキストフィールドを編集していない場合、プレースホルダの値が「値の追加」含まれていますUITableView内のすべてのUITextFieldの変更をUIButtonでクリアする

UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(158, 6, 148, 24)]; 

NSString *strReplacement = [valueArray objectAtIndex:indexPath.row]; 

if (([strReplacement length] != 0) { 
    textField.text = strReplacement; 
} else { 
    textField.placeholder = @"Add Value"; 
} 

textField.delegate = self; 
[cell addSubview:textField]; 
[textField release]; 

これまでのところは良いです。

また、UITableViewのフッターにUIButtonを追加しました。 私が欲しいのは、すべての編集された値をクリアし、ユーザーがUIButtonをクリックしたときにUITableViewのすべてのUITextFieldを更新することです。

すべてのオブジェクトをvalueArrayから簡単に削除できますが、変更を反映するためにすべてのUITableViewセルを更新する方法を理解することはできません。

何か助けていただければ幸いです。 LQ

答えて

0

数時間の試行錯誤の末、私はこの解決策を考え出しました。 UIButton "Clear All"では、次のメソッドが呼び出されます。

- (IBAction)clearValues:(id)sender { 

    // count the number of values in the array (this is the same as the number of rows in the table) 
    int count = [valueArray count]; 

    // remove all values from the array (deletes any user added values): 
    [self.valueArray removeAllObjects]; 

    UITableViewCell *cell; 
    UITextField *textField; 

    // loop through each row in the table and put nil in each UITextField: 
    for (NSUInteger i = 0; i < count; ++i) { 

     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; 
     cell = [self.wordsTableView cellForRowAtIndexPath:indexPath]; 

     // NOTE: Make sure none of your tags are set to 0 since all non-tagged objects are zero. 
     // In table construction, your textFieldTags should be: textField.tag=indexPath.row+1; 

     textField = (UITextField*)[cell viewWithTag:i+1]; 
     textField.text = nil; 

    } 

} 
2

私は、あなたが探していることは

[tableView reloadData]; 
+0

私がUIButtonを押すと、valueArrayの値がパージされます(値がパージされていることが確認されます)が、リロード値の後もreloadDataの後にUITextFieldsが入力されます。 –

+0

が奇妙です。 'cellForRowAtIndexPath:'メソッドにブレークポイントを置き、 'reloadData'の後に' valueArray'の内容を見てみてください。 – filipe

+0

- (IBAction)clearReplacements:(ID)、送信者{\t \t \t \t \t \t \t \t \t \t \t \t \t [self.valueArray removeAllObjects]。 \t [myTableView reloadData]; \t }テーブルをリロードしません。ブレークポイントを使用するコードは、reloadDataの後で停止します。 –

0

フィリペのソリューションは、高パフォーマンスのオーバーヘッドを持っている可能な限り、このメソッドを呼び出すようreloadDataは避けるべき呼び出して、しかし、また、動作するはずであると信じています。

あなたがUIButtonインスタンスの両方を参照するだけでなく、あなたがテーブルに/画面上に持ってUITextFieldののすべてのインスタンスを持っているいくつかのクラスが必要です。 UITableViewコントローラのサブクラスに最適な仕事のようですね!あなたのコードで

は上記、なぜあなたはまた、あなたがNSArrayのごのUITableViewコントローラに住んでいるテキストフィールドのに作成した各のUITextFieldを追加しませんか?ユーザはUIButtonを押すと、次に、アクションが@""に各インスタンスのtextプロパティを設定にNSArray内のすべてUITextFieldの要素をループコントローラークラスにいくつかのメソッドを呼び出すことができます。

警告:あなたはセルを再利用している場合、あなたはUITextFieldsのコントローラのにNSArrayが正しく更新されていることを確認する必要があります。

+0

私はそれぞれのUITextField要素にタグプロパティを使用していますが、別の方法でそれらを解決する方法が明確ではありませんか? –

1

解決策は奇妙です。 Filipeは正しい方法は[wordsTableView reloadData]であり、これにより可視セルごとにtableView:cellForRowAtIndexPath:が呼び出されます。このメソッドは、テーブルをスクロールするときにも呼び出されるため、reloadDataが機能していない場合は、データを変更してスクロールするときに、正しく更新されないバグが発生する可能性があります。あなたのclearValuesメソッドでは、同じことをtableView:cellForRowAtIndexPath:を呼び出して実行しています。

本当の問題はあなたのtableView:cellForRowAtIndexPath:実装にあると思います。この方法には一般に2つのセクションがあります。文は、一般的に、あなたのセルにサブビューを追加する必要がある唯一の場所である場合

その内部
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease]; 
} 

:まず、あなたのような何かを参照を取得するために、細胞を作成したり、リサイクル。 dequeueReusableCellWithIdentifier:がセルを返す場合は、既にサブビューがあるはずです。

次に、if文の後に、サブビューの内容を入力または更新します。元のコードの問題は、セルにテキストフィールドがないと仮定して、テキストフィールドにデータを入力してサブビューとして追加することです。あなたはおそらくあなたがUITextFieldDelegateでそれを使用できるように、行番号にテキストフィールドのタグ値を設定することができるように見えます

int textFieldTag = 100; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease]; 
    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(158, 6, 148, 24)]; 
    [textField setTag:textFieldTag]; 
    [textField setDelegate:self]; 
    [cell addSubview:textField]; 
    [textField release]; 
} 

UITextField *textField = [cell viewWithTag:textFieldTag]; 
NSString *strReplacement = [valueArray objectAtIndex:indexPath.row]; 

if (([strReplacement length] != 0) { 
    textField.text = strReplacement; 
} else { 
    textField.placeholder = @"Add Value"; 
} 

:だからあなたのtableView:cellForRowAtIndexPath:がより次のようになります。これは、行1のセルがdequeueReusableCellWithIdentifier:でリサイクルされ、行12になるかのように、予期しないタグ値を持つようなバグにつながる可能性があります。今起こっていなくても、それは起こるのを待っているバグであり、トラブルシューティングには手間がかかります。

+0

よろしくお願いいたします。私はセルの構造を見てみましょう。 –

関連する問題