質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.07%

UICollectionViewのセル内にテーブルビューを表示し、カテゴリーに沿ってスワイプでビューを切り替えたいです。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,346

obataatu

score 14

お世話になります。
現在、swiftを勉強中の初心者です。
UICollectionViewに関するご質問です。
UICollectionViewのセル内にテーブルビューを表示し、カテゴリーに沿ってスワイプでビューを切り替えたいと思っております。
現在、単純なViewのみをスクロールで切り替えることはできているのですが、そこにテーブルビューを入れ込む方法が分からなく、困っております。
知識が少なく、そのようなことが可能であるのかもわからない状況ですが、お分かりになる方がいらっしゃれば教えて頂けますと幸いです。
現在のコードを下記に記載致します。よろしくお願いいたします。

import UIKit
struct Pages2 {
    var viewControllers:[UIView] = []
}
class ViewController: UIViewController {

    @IBOutlet weak var collect1: UICollectionView!

    var pages2:Pages2 = Pages2(){
        didSet {
            self.collect1?.reloadData()
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        let wall = UIView()
        wall.backgroundColor = UIColor.blueColor()
        let width:CGFloat = self.view.bounds.width
        let heigth:CGFloat = self.view.bounds.height
        wall.frame = CGRectMake(0, 0, width, heigth)
        self.pages2.viewControllers.append(wall)

        let wall2 = UIView()
        wall2.backgroundColor = UIColor.greenColor()
        let width2:CGFloat = self.view.bounds.width
        let heigth2:CGFloat = self.view.bounds.height
        wall2.frame = CGRectMake(0, 0, width2, heigth2)
        self.pages2.viewControllers.append(wall2)

        let wall3 = UIView()
        wall3.backgroundColor = UIColor.redColor()
        let width3:CGFloat = self.view.bounds.width
        let heigth3:CGFloat = self.view.bounds.height
        wall3.frame = CGRectMake(0, 0, width3, heigth3)
        self.pages2.viewControllers.append(wall3)

        self.collect1.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "MyCell")

    }

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return self.pages2.viewControllers.count
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell",forIndexPath: indexPath) as UICollectionViewCell

        //viewの背景を指定している
        cell.backgroundColor = UIColor.whiteColor()
        let view = self.pages2.viewControllers[indexPath.row]
        cell.contentView.addSubview(view)
        return cell
    }

    /// セルの大きさ
    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

        let pageViewRect = self.collect1.bounds
        return CGSize(width: pageViewRect.width, height: pageViewRect.height)
    }

    /// 横のスペース
    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat {

        return 0

    }

    /// 縦のスペース
    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat {

        return 0

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

これは、横スクロール(横スワイプ)でUICollectionView内に配置したテーブルビューを切り替え、
縦スクロール(縦スワイプ)で、テーブルビュー内の行をスクロールアップ/ダウンさせたいということでしょうか?

もしそうでしたら、とりあえず
Collection View Flow Layoutの設定をHorizontalにし、
以下のようなCustomTableViewを作成し、

import UIKit

class CustomTableView: UITableView, UITableViewDelegate, UITableViewDataSource {

    init() {
        super.init(frame: CGRectZero, style: .Plain)
        self.delegate = self
        self.dataSource = self
        self.registerClass(UITableViewCell.self, forCellReuseIdentifier: "TableCell")
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 100
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("TableCell", forIndexPath: indexPath)
        cell.backgroundColor = tableView.backgroundColor
        cell.textLabel?.text = "row no=\(indexPath.row)"
        return cell
    }

}

let wall = UIView()
let wall2 = UIView()
let wall3 = UIView()
をそれぞれ
let wall = CustomTableView()
let wall2 = CustomTableView()
let wall3 = CustomTableView()
に変えるだけでできました。
collect1.pagingEnabled=true
も加えておいた方がたぶん使いやすいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/01 20:27

    ご返信ありがとうございます。
    大変失礼致しました。
    下記に現状のコードを記載致します。
    目的としましては、ViewController2に表示したテーブルビュー(前画面の動作次第で異なるテーブルビューが表示される予定です)からindexPath.rowが0のセルが押された場合にViewController3に飛びたいと思っております。
    しかし、セルを押した段階でEXC_BAD_INSTRUCTIONというエラーが出て止まってしまいます。
    セルが押された際にindexPath.rowを表示させてみた結果反応はしているので、移動部分のコードに問題があるのでしょうか?
    わかりずらい説明となってしまい、申し訳ありませんが、ご教授頂けますと幸いです。
    ```swift
    ViewController2

    import UIKit

    class ViewController2: UIViewController {

    var box2:UIView!

    @IBOutlet weak var top_view: UIView!

    override func viewDidLoad() {
    super.viewDidLoad()

    self.box2 = CustomTableView()
    self.box2.frame = CGRectMake(0, 0, self.view.bounds.width,self.view.bounds.height-120)

    top_view.addSubview(self.box2)

    }


    func to_greenpage(){

    let to_greenpage = self.storyboard?.instantiateViewControllerWithIdentifier("ViewController3") as! ViewController3
    self.presentViewController(to_greenpage, animated: true, completion: nil)
    }

    func to_bluepage(){

    let to_bluepage = self.storyboard?.instantiateViewControllerWithIdentifier("ViewController4") as! ViewController4
    navigationController?.pushViewController(to_bluepage, animated: true)
    }

    func to_redpage(){

    let to_redpage = self.storyboard?.instantiateViewControllerWithIdentifier("ViewController5") as! ViewController5
    navigationController?.pushViewController(to_redpage, animated: true)
    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    }

    }

    ```

    ```swift
    カスタムテーブルビュー swift
    import UIKit

    class CustomTableView: UITableView ,UITableViewDelegate, UITableViewDataSource {

    var memos:[String] = ["店員1","店員2","店員3","店員4","店長さん1"]

    var gazo:[UIImage]? = [UIImage(named:"店員1")!,UIImage(named:"店員2")!,UIImage(named:"店員3")!,UIImage(named:"店員4")!,UIImage(named:"店長さん1")!]

    init() {
    super.init(frame: CGRectZero, style: .Plain)
    self.delegate = self
    self.dataSource = self
    self.rowHeight = 90
    self.registerClass(UITableViewCell.self, forCellReuseIdentifier: "TableCell")
    }

    required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return memos .count
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    print(indexPath.row)
    if (indexPath.row == 0) {

    ViewController2().to_greenpage()
    }
    else if(indexPath.row == 1){
    ViewController2().to_bluepage()

    }
    else if(indexPath.row == 2){
    ViewController2().to_redpage()

    }

    else {
    return
    }
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("TableCell", forIndexPath: indexPath)
    cell.backgroundColor = tableView.backgroundColor
    cell.textLabel?.text = memos[indexPath.row];
    cell.textLabel?.font = UIFont.boldSystemFontOfSize(25)
    cell.textLabel?.textColor = UIColor.blackColor()

    let gazo1 = gazo![indexPath.row]
    cell.imageView?.image = gazo1.resize3(CGSizeMake(100, 150))
    cell.imageView?.contentMode = .ScaleAspectFill
    return cell
    }
    }
    extension UIImage {

    func resize3(size: CGSize) -> UIImage {
    let widthRatio = size.width / self.size.width
    let heightRatio = size.height / self.size.height
    let ratio = (widthRatio < heightRatio) ? widthRatio : heightRatio
    let resizedSize = CGSize(width: (self.size.width * ratio), height: (self.size.height * ratio))
    // 画質を落とさないように以下を修正
    UIGraphicsBeginImageContextWithOptions(resizedSize, false, 0.0)
    drawInRect(CGRect(x: 0, y: 0, width: resizedSize.width, height: resizedSize.height))
    let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return resizedImage
    }
    }

    ```

    キャンセル

  • 2016/07/01 22:11 編集

    ViewController2().to_redpage()
    とやると、現在表示中のViewController2ではなく、新しいViewController2を生成して、その新しいViewController2のto_redpageを呼び出すことになります。
    新しいViewController2は、Storyboardで生成したものではありませんから、to_redpageに書かれている「self.storyboard?」はnilです。このため新しいViewController5が正しく生成できずにエラーになるのだと思います。
    CustomTableViewが現在表示中のViewControllerにイベントを通知したかったら、前回の質問でサンプルを示したようにdelegateを作って通知すればよいと思います。

    キャンセル

  • 2016/07/02 03:10

    ご返信頂き、ありがとうございます。
    自分だけではエラーの原因のイメージができませんでしたので、わかりやすくご説明頂き、大変助かりました。
    ご指摘いただいた通り、デリゲートを作り、メソッドを渡すことにします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Swiftに関する質問
  • UICollectionViewのセル内にテーブルビューを表示し、カテゴリーに沿ってスワイプでビューを切り替えたいです。