3

これが私が最終的にやろうとしていることです。UITableView にアイテムのメニューを表示したいのですが、動的に、表示されるアイテムのタイプによってロードされたカスタムセルビューが決定されるようにします。たとえば、メニュー項目タイプが「switch」であるとすると、「switch.xib」という名前の nib がロードされ、その特定のメニュー項目の値に応じて状態がオン/オフになります。「スイッチ」タイプですが、値が異なる項目が 5 つあります。したがって、それぞれに同じxibを使用したいのですが、インスタンスは5つです。

ですから、質問には長い道のりがあります。ペン先からセルビューをロードするとき、画面上でスクロールバックするときのデキュー用に一意の再利用識別子が必要だと思いますよね? (インスタンスごと、つまりメニュー項目ごとに一意です。) Interface Builder の UITableViewCell で、再利用識別子プロパティを設定できる場所がわかりますが、実行時にスイッチのインスタンスごとに設定したいと考えています。たとえば、メニュー項目 #1 はスイッチ、#2 はテキスト フィールド、#3 はスイッチなどです。したがって、#1 と #3 の両方をデキューするには一意のセル ID が必要です。

私の cellForRowAtIndexPath は次のようになります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Cells are unique; dequeue individual cells not generic cell formats
NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d", indexPath.row];

ITMenuItem *menuItem = [menu.menuItems objectAtIndex:indexPath.row];

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    // Load cell view from nib
    NSString *cellNib = [NSString stringWithFormat:@"MenuCell_%@", menuItem.type];
    [[NSBundle mainBundle] loadNibNamed:cellNib owner:self options:nil];
    cell = myCell;
    self.myCell = nil;
}
// Display menu item contents in cell
UILabel *cellLabel = (UILabel *) [cell viewWithTag:1];
[cellLabel setText:menuItem.name];
if ([menuItem.type isEqualToString:@"switch"]) {
    UISwitch *cellSwitch = (UISwitch *) [cell viewWithTag:2];
    [cellSwitch setOn:[menuItem.value isEqualToString:@"YES"]];
}
else if ([menuItem.type isEqualToString:@"text"]) {
    UITextField *textField = (UITextField *) [cell viewWithTag:2];
    [textField setText:menuItem.value];
}

return cell;
}
4

4 に答える 4

0
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";
    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if(cell == nil)
    {
        cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    TextFieldFormElement *item = [self.formItems objectAtIndex:indexPath.row];
    cell.labelField.text = item.label;
    return cell;
}
于 2013-05-02T13:17:17.480 に答える
0

nib ファイルに再利用識別子を設定できます。したがって、switch.xib では、再利用識別子として「switch」を使用します。あとは変えるだけ

NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d", indexPath.row];

NSString *CellIdentifier = menuItem.type;

menuItem.typeそれが「スイッチ」であると仮定します

于 2012-11-14T01:26:10.637 に答える
0

私の考えでは、タイプが多すぎない場合は、各セルを異なるxibおよびswiftファイルで設計します。主にパフォーマンスの問題。

デキューできない場合は、別の識別子を指定してください。テーブルビューまたはコレクション ビューに複数の識別子を登録できます (この方法で 12 の異なるセルを使用するアプリの 1 つ)。

しかし、このように IBAction を処理するのは少し面倒です。

于 2019-12-23T15:51:34.047 に答える