0

たとえば、他のメニューにつながる設定メニューがあり、すべて同じスタイルになっています。テーブル ビューのセルのカスタマイズは次のように行われます。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = (UITableViewCell *)[self dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                      reuseIdentifier:CellIdentifier];

        cell.contentView.backgroundColor = [UIColor clearColor];
        cell.textLabel.backgroundColor = [UIColor clearColor];
    }

    BOOL isFirstRowInSection = NO;

    if (indexPath.row == 0) isFirstRowInSection = YES;

    BOOL isLastRowInSection = NO;

    int numberOfRowsInSection = [tableView.dataSource tableView:self numberOfRowsInSection:indexPath.section];

    if (indexPath.section == 0 && indexPath.row == numberOfRowsInSection - 1) {
        isLastRowInSection = YES;
    }

    UIImageView *imageView = [[UIImageView alloc] initWithFrame:cell.bounds];
    imageView.image = cellBackgroundImage(cell.bounds.size, isFirstRowInSection, isLastRowInSection);

    cell.backgroundView = imageView;

    //cell.textLabel.text = @"This is a cell";

    return cell;
}

このクラスをメイン設定メニューとすべてのサブメニューで使用したいのですが、各セルのテキストなどの独自のデータを提供したい一方で、ここからセル スタイル メソッドを取得したいと考えています。

どうすればこれを達成できますか? 現在の考えでは、データソース プロトコルの一部を自分のデリゲートにレプリケートして、応答できるようにすることです。

4

2 に答える 2

1

UITableViewCellの特定のサブクラスを作成し、セル自体に視覚的特性を実装することができます。

InterfaceBuilderでサブクラスとnibファイルを作成すると、次のようなクラスメソッドを作成できます。

+ (NSString *)cellIdentifier {
    return NSStringFromClass([self class]);
}


+ (id)cellForTableView:(UITableView *)tableView {
    NSString *cellID = [self cellIdentifier];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    if (cell == nil) {
        NSArray *nibObjects = [[self nib] instantiateWithOwner:nil options:nil];
        NSAssert2(([nibObjects count] > 0) && 
                  [[nibObjects objectAtIndex:0] isKindOfClass:[self class]],
                  @"Nib '%@' does not appear to contain a valid %@", 
                  [self nibName], NSStringFromClass([self class]));
        cell = [nibObjects objectAtIndex:0];
    }
    return cell;    
}

したがって、クラス(MyTableViewCellなど)を定義してIBでインターフェイスを構築した場合は、FileOwnerをMyTableViewCellのオブジェクトにし、さまざまなサブクラス固有のビジュアルオブジェクトのIBOutletsとBobの叔父がいることを確認してください。

次に、tableViewControllerのcellForRowAtIndexPathメソッドで、次のようなものを使用します。

MyTableViewCell *cell = [MyTableViewCell cellForTableView:tableView];

このようにして、ビジュアルプレゼンテーションロジックの大部分がInterfaceBuilderコードで維持されます。ユニバーサルアプリを作成する場合は、2つのnibファイルを作成する必要がありますが、それはそれほど難しくありません。

于 2012-07-14T19:21:37.677 に答える
0

これを実装する 1 つの方法は、「他のメニュー」 (このテーブルビューが「つながる」メニュー) でこのテーブルビューの- tableView:cellForRowAtIndexPath:メソッドを呼び出すことです。それは次のようになります。

ChildTableViewController.m:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // Somehow, you'll need to give this child VC a pointer to the
    // "root" tableview – I'll pretend that pointer is "rootTableView"
    return [rootTableView tableView:tableView cellForRowAtIndexPath:indexPath];
}

現在、1 つのテーブルビューだけでなく、多くのテーブルビューがこのメソッドを使用してセルを取得しているため、そのメソッドから返される内容について十分に理解しておく必要があります。UITableViewセルを要求しているものを確認することでこれを行うことができます。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = (UITableViewCell *)[self dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                      reuseIdentifier:CellIdentifier];

        cell.contentView.backgroundColor = [UIColor clearColor];
        cell.textLabel.backgroundColor = [UIColor clearColor];
    }

    BOOL isFirstRowInSection = NO;

    if (indexPath.row == 0) isFirstRowInSection = YES;

    BOOL isLastRowInSection = NO;

    int numberOfRowsInSection = [tableView.dataSource tableView:self numberOfRowsInSection:indexPath.section];

    if (indexPath.section == 0 && indexPath.row == numberOfRowsInSection - 1) {
        isLastRowInSection = YES;
    }

    UIImageView *imageView = [[UIImageView alloc] initWithFrame:cell.bounds];
    imageView.image = cellBackgroundImage(cell.bounds.size, isFirstRowInSection, isLastRowInSection);

    cell.backgroundView = imageView;

    //cell.textLabel.text = @"This is a cell";

    // Now, all your cells have the same formatting; do your custom 
    // data grabbing or whatever you need to do for the different
    // tableviews
    if (tableview == [self view]) {
        return cell;
    } else if (tableview = [self childTableView1]) {
        // Do the setup you'd want for your first child tableview
        return cell;
    } else if (tableview = [self childTableView2]) {
        // Do the setup you'd want for your second child tableview
        return cell;
    }   // More if statements as needed

    return cell;
}

ただし、表示したメソッドのコードを単にコピーして、- tableView:cellForRowAtIndexPath:各「子」テーブルビューのメソッドに貼り付ける方がクリーンな場合があります。それほど長くはなく、セットアップの頭痛の種ははるかに少なくなります.

于 2012-07-14T17:55:02.310 に答える