7160


`TableView`の各セルで横スクロールやページングを行いたいのですが、イマイチ考え方が分かりません。`Storyboard`に`UITableView`を乗せてその上に複数の`UITableViewCell`を乗せ、その各セル上に`UIScrollView`を置きました。それから`Storyboard`上の各`UIScrollView`に`UITableViewCell`を継承したクラスを紐付けました。一度この状態でビルドすると、空のセルを持った`TableView`が表示されるのですが、ここからどうすればいいのか分かりません。`TableView`の`cellForRowAtIndexPath`メソッド内で`ScrollView`に画像を置いたり、ページング処理を施すのでしょうか？または`UITableViewCell`を継承したクラス内で何か処理を行うのでしょうか？下に現在の途中まで書いているコードを記します。この先どういう風にプログラムを組んでいけばいいかアドバイスをいただきたいです。すみませんが、よろしくお願いします。

ViewController.h

[code]

    @interface ViewController : UITableViewController
    
    @end
    
[/code]

ViewController.m

[code]

    @interface ViewController () {
    
        IBOutlet UITableView *_tableView;
    }
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
        UINib *nib = [UINib nibWithNibName:NSStringFromClass([PagerCell class]) bundle:nil];
        [_tableView registerNib:nib forCellReuseIdentifier:@"cell"];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return 4;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        PagerCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    
        if (!cell) {
            cell = [[PagerCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
        }
    
        switch (indexPath.row) {
            case 0:
                [self setTopPager];
                break;
    
            default:
    
                break;
        }
    
        return cell;
    }
    
    - (void)setTopPager {
        PagerCell *pagerCell = [[PagerCell alloc]init];
        [pagerCell setTopPager:self.view];
    }
    
    @end
    
[/code]

PagerCell.h

[code]

    @interface PagerCell : UITableViewCell
    
    @property (weak, nonatomic) IBOutlet UIScrollView *pager;
    
    - (void)setTopPager:(UIView*)_view;
    
    @end
    
[/code]

PagerCell.m

[code]

    @implementation PagerCell
    
    - (void)awakeFromNib {
        // Initialization code
    }
    
    - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
        [super setSelected:selected animated:animated];
    
        // Configure the view for the selected state
    }
    
    - (void)setTopPager:(UIView*)_view {
        NSArray* imageNames = [NSArray arrayWithObjects:@"android.png", @"android.png", @"android.png", @"android.png", @"android.png", @"android.png", @"android.png", @"android.png", @"android.png", @"android.png", nil];
        int imageNum = [imageNames count];
        for (int i=0; i < imageNum; i++) {
            UIImage* image = [UIImage imageNamed:[imageNames objectAtIndex:i]];
            UIImageView* imageView = [[UIImageView alloc] initWithImage:image];
            CGSize size = CGSizeMake(100, 100);
            imageView.frame = CGRectMake(160*i + (160 - size.width) / 2, 0 + (180 - size.height) / 2, size.width, size.height);
            [self.pager addSubview:imageView];
        }
        [self.pager setContentSize:CGSizeMake(100*imageNum, 120)];
        [_view addSubview:self.pager];
    }
    
    @end
    
[/code]


CC BY-SA 3.0
2015-02-26T07:45:16.700
7134
2015-02-27T01:09:35.607
2015-02-26T22:57:55.727
5210
5210
question
objective-c uitableview uiscrollview
TableViewの各セルで横スクロールやページング処理をしたい


returnのcellがUITableViewCellのままなので、こんな感じでできるのではないでしょうか?

[code]

    PagerCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    
    if (!cell) {
        cell = [[PagerCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }
    
[/code]


CC BY-SA 3.0
2015-02-26T10:12:45.633
7146
2015-02-26T10:12:45.633
8567
7134
answer


>
> TableViewのcellForRowAtIndexPathメソッド内でScrollViewに画像を置いたり、ページング処理を施すのでしょうか？またはUITableViewCellを継承したクラス内で何か処理を行うのでしょうか？

後者（カスタムセル側で処理）の方が良いと思います。  
cellForRowAtIndexPath内でカスタムセルに表示したいデータを渡して、  
データの加工や表示についてはカスタムセル側に任せた方が見やすいし変更もしやすいです。

また、個人的にはカスタムセル側で色々な処理をしたい場合は、別途`xib`を作成してカスタムセルと紐付ける方がやりやすいと思います。  
※この場合は`Storyboard`上に`CustomCell`を配置する必要はありません。

ざっくり書くとこんな感じです。  
※セルの再利用とかは考慮していません。

ViewController.m

[code]

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // セルを登録
        UINib *nib = [UINib nibWithNibName:NSStringFromClass([CustomCell class]) bundle:nil];
        [_tableView registerNib:nib forCellReuseIdentifier:@"cell"];
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        CustomCell* cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    
        // 表示要素を設定
        [cell setElementsValue:datasource_[indexPath.row]];
        return cell;
    }
    
[/code]

CustomCell.h

[code]

    @interface CustomCell : UITableViewCell
    
    - (void)setElementsValue:(NSDictionary *)dic;
    
    @end  
    
[/code]

CustomCell.m

[code]

    @interface CustomCell ()
    
    @property (weak, nonatomic) IBOutlet UILabel *title;
    @property (weak, nonatomic) IBOutlet UILabel *body;
    
    @end  
    
    @implementation CustomCell
    
    - (void)setElementsValue:(NSDictionary *)dic
    {
        // タイトル
        [self setTitleText:dic[@"title"]];
        // 本文
        [self setBodyText:dic[@"body"]];
    }
    
    // タイトル設定
    - (void)setTitleText:(NSString *)text
    {
        _title.text = text;
    }
    
    // 本文設定
    - (void)setBodyText:(NSString *)text
    {
        _body.text = text;
    }
    
    // その他スクロール処理等
    
    @end
    
[/code]

----- 質問追記部分に対する追記 -----
[code]

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        PagerCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    
        if (!cell) {
            cell = [[PagerCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
        }
    
        switch (indexPath.row) {
            case 0:
                [self setTopPager];
                break;
    
            default:
    
                break;
        }
    
        return cell;
    }
    
    - (void)setTopPager {
        PagerCell *pagerCell = [[PagerCell alloc]init];
        [pagerCell setTopPager:self.view];
    }
    
[/code]

ここの処理がおかしいです。  
せっかく`cellForRowAtIndexPath`内で`tableView`に紐付けたセルを取得しているのに  
`setTopPager`で不要なインスタンスを新たに作成しています。  
また`PagerCell`の`setTopPager`を不要なインスタンス側で実行しているため、  
`tableView`に紐付けたセル側では何も起きません。

この辺りは`UITableView`を使用する際には重要な知識だと思いますので、  
基本的な使い方を再確認しておくと良いと思います。


CC BY-SA 3.0
2015-02-26T15:46:34.563
7160
2015-02-27T01:09:35.607
2015-02-27T01:09:35.607
3516
3516
7134
answer