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

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

ただいまの
回答率

89.23%

registerしたはずのcellが反映されない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 562

amazon_106

score 34

完成イメージ

現在
イメージ説明

やりたいこと
下部のグレーのcellをsimulatorに反映させたい
現在はSelectPhotoCellのプログラムが反映されていない状態です。

SelectImage.VC

import UIKit
import Photos

private let reuseIdentifier = "SelectPhotoCell"
private let headerIdentifier = "SelectPhotoHeader"

class SelectImageVC: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    // MARK: - Properties
    var images = [UIImage]()
    var assets = [PHAsset]()
    var selectedImage: UIImage?
    var header: SelectPhotoHeader?

    override func viewDidLoad() {
        super.viewDidLoad()

//       register cell classes
        // 下部の選択画面の登録
        collectionView?.register(SelectPhotoCell.self, forCellWithReuseIdentifier: reuseIdentifier)
        // 上部の大画面の登録
        collectionView?.register(SelectPhotoHeader.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: headerIdentifier)

        collectionView.backgroundColor = .white

        configureNavigationButtons()

        fetchPhotos()

    }

    // cellのサイズ
    // MARK: - UICollectionViewFlowLayout UICollectionViewDelegateFlowLayoutを適用させた上で  サイズ指定できる
    // referenceSizeForHeaderInSection header(上部の大きい)のcellについてのサイズ指定
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
        // 幅
        let  width = view.frame.width
        // 正方形
        return CGSize(width: width, height: width)
    }

    //  複数cellのサイズ指定
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        // 3という余白(区切り線)を作り,一行を4つのcellで割りたい(作りたい)
        let width = (view.frame.width - 3) / 4
        // 正方形
        return CGSize(width: width, height: width)
    }
    //セルの水平方向のマージンを設定
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 1
    }
    //セルの垂直方向のマージンを設定
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 1
    }



    // MARK: - UICollectionViewDataSource

    // セクションの数
    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    // セルの個数
    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return images.count
    }

    // header(選択し表示される大きい画面)の内容を決める
    override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {


        // 登録したヘッダーを取得
        let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerIdentifier,  for: indexPath) as! SelectPhotoHeader

        self.header = header

        if let selectedImage = self.selectedImage {


            // index selected image 画質を良くする
            if let index = self.images.index(of: selectedImage) {

                // asset associated with selected image
                let selectedAsset = self.assets[index]

                let imageManager = PHImageManager.default()

                let targetSize = CGSize(width: 600, height: 600)


                // request image
                imageManager.requestImage(for: selectedAsset, targetSize: targetSize, contentMode: .default, options: nil) { (image, info) in

                    header.photoImageView.image = image
                }

            }
        }

        return header
    }


    // cellの内容を決める
    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        // as! cellをSelectPhotoCellの型に変換(ダウンキャスト)する ?????
        // privateで指定した reuseIdentifier = "SelectPhotoCell"を呼んでいる
        // 登録した下部のcellを取得する
        let cell  = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! SelectPhotoCell

        cell.photoImageView.image = images[indexPath.row]

        return cell
    }



    override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        self.selectedImage = images[indexPath.row]
        self.collectionView?.reloadData()

        let indexPath = IndexPath(item: 0, section: 0)
        collectionView.scrollToItem(at: indexPath, at: .bottom, animated: true)

    }

    // MARK: - Handlers 上部のnavbar

    @objc func handleCancel() {
        // モーダルウィンドウを閉じる
        self.dismiss(animated: true, completion: nil)
    }

    @objc func handleNext() {
        let uploadPostVC = UploadPostVC()
        uploadPostVC.selectedImage = header?.photoImageView.image
        navigationController?.pushViewController(uploadPostVC, animated: true)

    }

    func configureNavigationButtons() {

        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(handleCancel))

        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Next", style: .plain, target: self, action: #selector(handleNext))
    }




    func getAssetFetchOptios() -> PHFetchOptions {

        let options = PHFetchOptions()

        // fetch limit 30枚のみ取得する
        options.fetchLimit = 30

        // sort photos by date 一番上から最新順に並べる
        let sortDescritor = NSSortDescriptor(key: "creationDate", ascending: false)

        // set sort descriptor for options
        options.sortDescriptors = [sortDescritor]

        // return options
        return options

    }

    func fetchPhotos() {


        let allPhotos = PHAsset.fetchAssets(with: .image, options: getAssetFetchOptios())

        print("機能が機能している")


        // fetch images on background thread
        DispatchQueue.global(qos: .background).async {

            // enumerate objects
            allPhotos.enumerateObjects({ (asset, count, stop) in

                print("Count is  \(count)")


                let imageManager = PHImageManager.default()
                let targetSize = CGSize(width: 200, height: 200)
                let options = PHImageRequestOptions()
                options.isSynchronous = true

                // request image reprentation for specified asset
                imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFit, options: options, resultHandler: { (image, info) in

                    if let image = image{

                        // append image to data source
                        self.images.append(image)

                        // append assets to data source
                        self.assets.append(asset)

                        // set selected image with first image
                        if self.selectedImage == nil {
                            self.selectedImage = image
                        }

                        // reload collection view with images once count has completed

                        if count == allPhotos.count - 1 {

                            // reload collection view on main thread
                            DispatchQueue.main.async {

                                self.collectionView.reloadData()
                            }
                        }

                    }
                })


            })
        }
    }
}

SelectPhotoCell

import UIKit
// 画像選択、下部の複数の画像
class SelectPhotoCell: UICollectionViewCell {


    let photoImageView: UIImageView = {
        let iv = UIImageView()
        iv.contentMode = .scaleAspectFill
        iv.clipsToBounds = true
        iv.backgroundColor = .lightGray
        return iv
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)

        addSubview(photoImageView)
        photoImageView.anchor(top: topAnchor, left: leftAnchor, bottom: bottomAnchor, right: rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)
    }

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


}


全くわからない状態です。
よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2019/04/07 08:09

    しつもんはなんでしょうか

    キャンセル

  • amazon_106

    2019/04/07 10:02

    編集します

    キャンセル

回答 1

check解決した方法

0

他のSimulatorでビドしたら、無事表示されました。
「写真を許可しますか?」というポップアップが出ました。それを許可したら写真が表示されました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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