私はプログラムでObjectivecのテーブルビューを作成しています。プログラムでセルを静的にするにはどうすればよいですか?
ありがとう
私はプログラムでObjectivecのテーブルビューを作成しています。プログラムでセルを静的にするにはどうすればよいですか?
ありがとう
プログラムでセルを静的にすることは、実際には意味がありません。静的セルは基本的にInterfaceBuilder専用であり、TableView全体が静的である必要があります。UILables、UITextFields、UIImageViewsなどをセルに直接ドラッグして、アプリの実行時にXcodeでどのように表示されるかを表示できます。
ただし、外部のデータソースを使用せず、すべてをハードコーディングすることで、セルをプログラムで「静的」にすることができます。これは通常、面倒で一般的にはお勧めできません。
「静的」セルが必要な場合は、.xibを使用して新しいUITableViewControllerを作成し、そこからカスタマイズすることをお勧めします。それ以外の場合は、すべての値をハードコーディングするだけで、基本的に同じですが、回避できる場合は設計が不十分になる可能性があります。
それぞれに個別のセル識別子を使用することで、それを取得できます。次のようなものを使用できます。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *cellIdentifier = [NSString stringWithFormat:@"s%i-r%i", indexPath.section, indexPath.row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
//you can customize your cell here because it will be used just for one row.
}
return cell;
}
昔ながらの方法でセルを作成し、それに応じてセルを作成することもできますNSIndexPath
。これは、静的セルTVCと通常のテーブルビューで機能します(データソースメソッドで適切な数のセクションと行を返すことを忘れないでください)。 :
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
switch indexPath.row {
case 0:
// First cell, setup the way you want
case 1:
// Second cell, setup the way you want
}
// return the customized cell
return cell;
}
たとえば、設定画面などのセル構造を作成したいのですが、セルの内容を変更するだけで、数やセクションの構造は変更せず、UITableViewControllerサブクラスのメソッドを次のようにオーバーロードできます。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *aCell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
// Configure the cell...
if ([aCell.reuseIdentifier isEqualToString:@"someIdentifier"]){
//some configuration block
}
else if ([aCell.reuseIdentifier isEqualToString:@"someOtherIdentifier"]) {
//other configuration block
}
return aCell;
}
しかし、もう少しコードを追加することで、より良い方法でそれを作成できます。
1).mファイルの先頭にtypedefを追加します。
typedef void(^IDPCellConfigurationBlock)(UITableViewCell *aCell);
2)cellConfigurationsプロパティをTablviewControllerSubclass拡張機能に追加します。
@interface IPDSettingsTableViewController ()
@property (nonatomic, strong) NSDictionary *cellConfigurations;
@property (nonatomic) id dataModel;
@end
3)ストーリーボードまたはxibのTableviewControllerサブクラスの静的セルを変更し、プログラムで変更するセルごとに一意のcellReuseIdentifierを追加します
4)viewDidLoadメソッドのセットアップcellsConfigurationブロック:
- (void)viewDidLoad
{
[super viewDidLoad];
[self SetupCellsConfigurationBlocks];
}
- (void)SetupCellsConfigurationBlocks
{
//Store configurations code for each cell reuse identifier
NSMutableDictionary *cellsConfigurationBlocks = [NSMutableDictionary new];
//store cells configurations for a different cells identifiers
cellsConfigurationBlocks[@"someCellIdentifier"] = ^(UITableViewCell *aCell){
aCell.backgroundColor = [UIColor orangeColor];
};
cellsConfigurationBlocks[@"otherCellIdentifier"] = ^(UITableViewCell *aCell){
aCell.imageView.image = [UIImage imageNamed:@"some image name"];
};
//use waek reference to self to avoid memory leaks
__weak typeof (self) weakSelf = self;
cellsConfigurationBlocks[@"nextCellIdentifier"] = ^(UITableViewCell *aCell){
//You can even use your data model to configure cell
aCell.textLabel.textColor = [[weakSelf.dataModel someProperty] isEqual:@YES] ? [UIColor purpleColor] : [UIColor yellowColor];
aCell.textLabel.text = [weakSelf.dataModel someOtherProperty];
};
weakSelf.cellConfigurations = [cellsConfigurationBlocks copy];
}
5)次のようにtableView:cellForRowAtIndexPathメソッドをオーバーロードします。
#pragma mark - Table view data source
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *aCell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
// configure cell
[self configureCell:aCell withConfigurationBlock:self.cellConfigurations[aCell.reuseIdentifier]];
return aCell;
}
- (void)configureCell:(UITableViewCell *)aCell withConfigurationBlock:(IDPCellConfigurationBlock)configureCellBlock
{
if (configureCellBlock){
configureCellBlock(aCell);
}
}
メニューまたはフォームとして使用する単純なテーブルを作成することは非常に一般的ですが、組み込みのAPIをデータソースおよびデリゲートコールバックで使用すると、作成や保守が容易になりません。一部のセルを動的に追加/削除/更新する必要がある場合があるため、ストーリーボードを単独で使用しても機能しません。
MEDeclarativeTableを組み合わせて、プログラムで小さなテーブルを作成しました。のデータソースとデリゲートを提供しますUITableView
。最終的に、データソースとデリゲートのメソッドを実装する代わりに、セクションと行のインスタンスを提供するAPIになります。