コンテンツもコレクションであるカスタム UICollectionViewCell があり、UICollectionView を使用してそのコンテンツを表示したいと考えています。これは可能ですか?どうすればこれを達成できますか? UICollectionViewDataSource からも継承するカスタム UICollectionViewCell を作成し、UICollectionView 内部プロパティを定義しましたが、期待どおりに動作しません。何か案が?
6 に答える
これを行う方法の例を次に示します。標準 UITableViewController、カスタム UITableViewCell、および別のフリーフォーム カスタム UIViewController を含むストーリーボードがあります。
// ContainerCell.h
@class CellContentViewController;
@interface ContainerCell : UITableViewCell
@property (nonatomic, strong) CellContentViewController* contentViewController;
@end
// CellContentViewController.h
@interface CellContentViewController : UIViewController
@property (nonatomic, weak) IBOutlet UILabel* nameLabel;
@end
// CellContentViewController.m
@interface CellContentViewController ()
- (IBAction)didTapButton:(UIButton*)sender;
@end
@implementation CellContentViewController
- (void)didTapButton:(UIButton *)sender
{
NSLog(@"Button for %@!", self.nameLabel.text);
}
@end
// MyTableViewController.m
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString* const kCellIdentifier = @"ContainerCell";
ContainerCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier forIndexPath:indexPath];
if (!cell.contentViewController)
{
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
CellContentViewController* contentViewController= [storyboard instantiateViewControllerWithIdentifier:@"CellContentViewController"];
cell.contentViewController = contentViewController;
[cell.contentView addSubview:cell.contentViewController.view];
}
cell.contentViewController.nameLabel.text = self.names[indexPath.row];
return cell;
}
その結果、カスタム ビュー コントローラーがボタンのタップに応答します。ビューがテーブルに表示されたり消えたりするときに、ビューのライフサイクル メソッドが呼び出されるわけではありません。
私は概念実証としてこれを行いましたが、私が取り組んでいるプロジェクトではCellContentViewController
、単なるカスタム ビューではなくビュー コントローラーであることの利点は見当たりません。
これは可能です。通常、内部コレクションビューを管理するビューコントローラーを作成し、このビューコントローラーのビューを外部コレクションビューのセルのコンテンツビューに追加します。
あなたは現在遭遇した試みや問題について何も説明していないので、これ以上のことを提供することはできません。
BrettTheParkが述べたように、ストーリーボードのUICollectionVIewプロトタイプセルにコンテナビューを追加することはできません。
ストーリーボードに別のビューコントローラーを作成し、これをUICollectionViewで使用しているUICollectionViewCellサブクラスのビューにプログラムで追加することができます。このビューコントローラは、もちろんUICollectionViewControllerにすることができます。
例:
-(void)awakeFromNib
{
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle: nil];
UIViewController *controller = [mainStoryboard instantiateViewControllerWithIdentifier:@"MyUIViewController"];
[self addSubview:controller.view];
}
私が理解していることから、これは不可能です。
ストーリーボードで試してみましたが、エラーが発生しました:
「コンテナー ビューは、実行時に繰り返される要素には配置できません」
UITableViewController
としてコンテンツを作成しますStatic
。