1

UITableView のセルにさまざまなアクセサリを作成する作業を行っています。

行ごとに指定する必要があります。

この目的のために、ラベル、imageView、およびアクセサリに関する情報を保持する dataSource NSDictionary を作成しました。Label と imageView は非常に簡単ですが、付属品である種の障害にぶつかりました。

私の考えは、UIView を返す dataSource 内にブロックを含めることでした。このようなもの

self.dataSource = @[
    @{
        @"label" : @"This is the Label",
        @"icon" : @"icon_someIconName.png",
        @"accessory" : (UIView*) ^ {
            // code that returns the accessory for this row would go here
            return nil;  // 
        }  
    },
    ... 
];

そして、tableView:cellForRowAtIndexPath 内:

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

// Configure the cell...

NSDictionary *cellDataSource = self.dataSource[indexPath.section][@"fields"][indexPath.row];

cell.textLabel.text = cellDataSource[@"label"];
[cell.imageView setImage:[UIImage imageNamed:cellDataSource[@"icon"]]];

// Accessory setup
UIView* (^accessoryBuilderBlock)(void) = cellDataSource[@"accessory"];
if (accessoryBuilderBlock) {
    cell.accessoryView = accessoryBuilderBlock();
}

この時点でプログラムがクラッシュします。

  1. これを行うより効率的な方法はありますか?私は Objective-C にかなり慣れていないので、ベスト プラクティスを完全には把握していません。

  2. 特に、コレクション内に挿入するときにARCブロックの下でコピーする必要があることをどこかで読んだため、dataSetでブロックを使用している方法が正しくないことはほぼ確実です。これを行うための正しい方法(これが正しい場合)を教えてもらえますか?

ありがとう!

4

2 に答える 2

1

問題は確かにブロックをコピーしていないことであり、それがローカルブロックである場合、現在のスコープから割り当てが解除されます。だからそれをコピーしてみてください:

self.dataSource = @[
    @{
        @"label" : @"This is the Label",
        @"icon" : @"icon_someIconName.png",
        @"accessory" : [(UIView*)^ {
            // code that returns the accessory for this row would go here
            return nil;  // 
        } copy]
    },
    ... 
];
于 2013-09-30T22:38:25.003 に答える
0

辞書を使用する代わりに、テーブル ビューのデータ ソースのデータを保持するクラスを作成できます。そうすれば、好きなカスタム ロジックを使用できます。そのようです:

@interface MyClass : NSObject

@property (nonatomic, strong) NSString *label;
@property (nonatomic, strong) UIImage *icon;

- (UIView *)accessoryView; // Some method to return your accessoryView

@end

これは、はるかにクリーンな(そしてOOP-eyの)ソリューションになります。

于 2013-10-01T15:24:42.353 に答える