2017-01-22 4 views
0

私は11以上の行を持っています。最初のセルでのみUISwitchを作成する必要があります。任意の行をクリックするとUIスイッチが複製されます。1つのテーブルビューセルでUISwitchを作成する - UISwitchが重複する

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:EN_MoreTableViewCell]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:EN_MoreTableViewCell]; 
    cell.backgroundColor = [UIColor clearColor]; 
} 
cell.textLabel.text = languageObject.name; 
[cell.textLabel setFont:font]; 
if (indexPath.row == 0 && [languageObject.name isEqual: @"All Languages"]) { 
    if (!mySwitch) { 
     mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(_languageListTableView.frame.size.width - 60, 0, 40, 40)]; 
     [cell.contentView addSubview:mySwitch]; 
    } 
    cell.accessoryType = UITableViewCellAccessoryNone; 
} 
else { //other cell code// 

} 

助けてください。

+0

コードをフォーマットしてください。 – shallowThought

+0

最も便利な方法は、Interface Builderで2つの別個のテーブルビューセルを作成することです。 – vadian

答えて

1

次のいずれかの

は、ストーリーボードにUISwitchなしで1つずつを2つのプロトタイプのセルを作成し、のみindexPath.row == 0場合最初のデキュー。

または:

、ストーリーボードにあなたのセルにUISwitchを追加するには、セルにIBOutletを作り、細胞prepareForReuse()self.mySwitch.isHidden = trueを設定します。

このように、セルを再利用するときのデフォルトの状態は、隠しスイッチです。

indexPath.row == 0の場合は、cell.mySwitch.isHidden = falseと設定します。

1

これは古典的なiOS初心者の質問です。これは私たちが最初にテーブルビューを使用するときに私たちの大部分を混乱させます(最初は私を混乱させました)。

セルは一度作成され、何度も何度も再利用されます。関数dequeueReusableCellWithIdentifier()は、リサイクルされたセルがある場合はそれを返し、そうでない場合はセルプロトタイプから新しいセルを作成します。

リサイクルされたセルを取得した場合は、すでにスイッチが追加されています。

これを処理する最もクリーンな方法は、すべてのフィールドが既に追加され、アウトレットとしてセルに接続されているUITableViewCellのカスタムサブクラスを使用してセルプロトタイプを定義することです。次に、セルをデキューするときは、カスタムUITableViewCellクラスにキャストし、定義したプロパティを使用してカスタムフィールドにアクセスします(この場合はスイッチ)。

リサイクルされたセルには、他のフィールド(文字列を含むようにラベルフィールドを設定した場合と同じように、文字列も含まれます)。古い値をクリアし、リサイクルされたセルを完全に設定する必要があります。

0

カスタムセルは、完全に良いものに単一のビューを追加するだけの大きなハンマーです(時にはカスタムセルクラスとプロトタイプではこの問題は解決されません)。標準UITableViewCell。そのような場合、レイジー作成は、ビューを再利用されたセル(または任意のビューの任意のサブビュー)で正確にに一度作成したを得る良いパターンです。これは次のように機能します。

// in your cellForRowAtIndexPath, after dequeuing cell 
UISwitch *switch = (UISwitch *)[cell viewWithTag:64]; // make up a unique tag 
if (!switch) { 
    switch = [[UISwitch alloc] initWithFrame:...]; 
    switch.tag = 64; // 64 must match the tag above 
    [cell addSubview:switch]; 
} 
// here, switch is always valid, but only created when it was absent 
0

ストーリーボードにUISwitchを追加します。コンセントを接続します。 tableviewのcellforrowatindexpathで、インデックスが0の場合、hidden = falseを設定します。隠し= trueを設定します。これがうまくいきたいです。

0

表示しないスイッチを非表示にして、特定のインデックスパスに対してそのスイッチのアクションを動的に設定するだけです。

関連する問題