2009-07-20 10 views
0

これは私が客観的な-c、ココア、xcode、そして間違いのような理解の限界に逆行していることを知っています。しかしここに私がやろうとしていることがあります:UITableViewカスタムセルはセル内容をリセットします

私はviewcontrollerでtableviewを持っています。テーブルビューのデリゲートはviewcontrollerです。 ViewControllerには、テーブルビューへのコンセントがあります。テーブルは、カスタムセル(IB xib付き)とxmlファイルのデータを使用してまとめられます。カスタムセルには2つのボタンがあります。セルが作成されるとボタンアクションがaddTargetとしてセルフコントロールに追加され、アクションに移動します。 viewcontrollerボタンアクションメソッドは、テーブル内で押されたボタンの行を取得し、セルのテキストとボタンのタイトルを変更します。

もちろん、その特定のセルを表示外にスクロールして表示に戻すと、開始状態にリセットされます。私はこれがセルのデキューなどどんなアイデアと関係していると思いますか?

カスタムセル:

はここでは関係ビットとコードのボタンとtextlabelに店舗を持っています。

細胞は...データソースcellForRowAtIndexPathで

NSIndexPath *thisCellPath = [NSIndexPath indexPathForRow:[sender tag] inSection:0]; 
dialogue_cell *thisCell = (dialogue_cell *)[self.dialogueTable cellForRowAtIndexPath:thisCellPath]; 
NSString *row = [NSString stringWithFormat:@"%i",[sender tag]]; 
if ([thisCell.languageButton.currentTitle isEqualToString:@"en"]) { 
    [thisCell.languageButton setTitle:@"zc" forState:UIControlStateNormal]; 
    thisCell.mainText.text = [[self.lineArray objectForKey:row] valueForKey:@"lineText_zc"]; 
} else { 
    [thisCell.languageButton setTitle:@"en" forState:UIControlStateNormal]; 
    thisCell.mainText.text = [[self.lineArray objectForKey:row] valueForKey:@"lineText_en"];   
} 

ので、2つの質問 {

static NSString *dialogueCellIdentifier = @"dialogueCellIdentifier"; 

dialogue_cell *cell = (dialogue_cell *)[tableView dequeueReusableCellWithIdentifier:dialogueCellIdentifier]; 

if (cell == nil) { 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"dialogue_cell" owner:self options:nil]; 
    cell = [nib objectAtIndex:0]; 
    [[cell lButton] addTarget:self action:@selector(lButtonPressed:) forControlEvents:UIControlEventTouchUpInside];  
} 

[[cell lButton] setTag:[indexPath row]]; 

NSString *row = [NSString stringWithFormat:@"%i",[indexPath row]]; 
NSString *en = [[self.dataArray objectForKey:row] valueForKey:@"en"]; 

cell.mainText.text = en; 


return cell; 
} 

とlButton方法コードを作成する:
1.への道がありますオフスクリーンでスクロールされていても、ラベルとボタンの名前にセルが保持されるようにしますか?
2.ボタンが表示されているビューコントローラーにボタンアクションを送信するのではなく、セルカスタムクラス内でラベルとボタン名を設定する方法はありますか?

ありがとうございます!

答えて

0

OK私は、あまりにもこの問題を抱えawihle連れて行ってくれたが、私はそれを把握するあなたが戻ってあなたを、あなたのセルを取得しようとしているとき、セルキューが、彼らはここで重要であるが、この

NSIndexPath *thisCellPath = [NSIndexPath indexPathForRow:[sender tag] inSection:0]; 
dialogue_cell *thisCell = (dialogue_cell *)[self.dialogueTable cellForRowAtIndexPath:thisCellPath]; 

ときに使用していますセルがビューから外れている場合、テーブルビューはこのセルをアンロードし、代わりに、ビューを元に戻すまでテーブルビューの長すぎる部分があるため、これを呼び出すと元の状態(またはprolill nil)画面。

あなたがしなければならないことは、あなたの細胞をエンキューしているからです。私はあなたがこれを正しくやっていると仮定しようとしています。セルのように

cell=[tableView dequeueReusableCellWithIdentifier:dialogueCellIdentifier]; 

これは、ユーザーがそれを変更したときの状態であなたの細胞を与える...これは助けて欲しい! 2番目の質問では、ターゲットをビューコントローラではなくセルに設定するだけで、カスタムセルクラス内でそのアクションを呼び出すことができます。

+0

助けてくれてありがとう - 実際に私は自分のスキームをlostInTransitと同じように作り上げました。問題を解決するという気持ちはまったく味わえない! –

1

デキューすることと実際には関係ありませんcellForRowAtIndexPathに表示しているデータだけではありません。セルが表示されるたびに、このメソッドが呼び出されます。

私はあなたがボタンのクリックでセルのテキストの言語を変更していると仮定します。しかし、セルが再描画されるたびに、英語のテキストが再表示されます。セルの状態を「保持」する1つの方法は、各セルで使用されている言語の配列を作成し、特定の行の配列の値に基づいてセルのテキストを設定することです。アレイ内のセルの状態を維持するだけで済みます。

+0

あなたは配列内のセルの状態を維持する必要があります....いいえ、あなたは私の投稿を見ないでください – Daniel

+0

実際に私はこの解決方法を自分で考え出しました。それはかなりうまくいく(それはスクロールするように見えるが、少し変わったように思える)。テーブルが15-20セルよりも長くなることはめったにないので、別の戦略を試してみてください。 –

関連する問題