Xcode
Firebase
Swift4.0

【iOS】プログラミング素人の俺が、Swift + Firebaseを使って、インスタクローンを作る!【ユーザページ完成編②】

目次

  • 前回
  • ユーザページを完成させる
  • 感想
  • 次回

前回

【iOS】プログラミング素人の俺が、Swift + Firebaseを使って、インスタクローンを作る!【ユーザページ完成編①】

ユーザページを完成させる

今回は、ユーザページの完成させる。(UI変更の過程で、多少修正する可能性あり。)
今回やる事は、

① Databaseからユーザネームと一言メッセージを取得し、表示させる。
② Databaseのuser/imagesにあるUIDを取得し、それを使って、画像を取得する。

をやる。

① コード

今回は、一部修正した部分だけを抜粋した。
元のコードを見たい方は、こちら

ImageViewController.swift
 //ダウンロードURL取得して、Storageからダウンロードする
        //ログイン情報取得
        let user = Auth.auth().currentUser
        if let user = user {
            //usercountからカウントデータを取得
            let usercount = self.ref.child("usercount/count")
            usercount.observe(DataEventType.value, with: { (snapshot) in
                let usercountStr = snapshot.value as? String
                let usercountInt = Int(usercountStr!)
                for u in 1 ... usercountInt! {
                    //user/imagesにあるUIDを取得
                    let userUID = self.ref.child("user/\(u)/UID")
                    userUID.observe(DataEventType.value, with: { (snapshot) in
                        let UIDstr = snapshot.value as? String
                        //ログインしたUIDとuser/imagesにあるUIDが同じ
                        if user.uid == UIDstr! {
                            //ユーザネームと一言メッセージを取得
                            let usernameData = self.ref.child("user/\(u)/username")
                            let usermsgData = self.ref.child("user/\(u)/msg")
                            usernameData.observe(DataEventType.value, with: { (snapshot) in
                                let username = snapshot.value as? String
                                let usernameStr = username!
                                let usernameLabel = UILabel(frame: CGRect(x: (w2 - 300) / 2, y: 100, width: 300, height: 40))
                                usernameLabel.text = "\(usernameStr)"
                                usernameLabel.textColor = .black
                                usernameLabel.textAlignment = .center
                                self.view.addSubview(usernameLabel)
                            })
                            usermsgData.observe(DataEventType.value, with: { (snapshot) in
                                let usermsg = snapshot.value as? String
                                let usermsgStr = usermsg!
                                let usermsgLabel = UILabel(frame: CGRect(x: (w2 - 300) / 2, y: 130, width: 300, height: 60))
                                usermsgLabel.text = "\(usermsgStr)"
                                usermsgLabel.textColor = .black
                                usermsgLabel.textAlignment = .center
                                self.view.addSubview(usermsgLabel)
                            })

                            //imgcountのカウントデータ値の存在確認
                            let imgCount = self.ref.child("imgcount/\(UIDstr!)/count")
                            imgCount.observe(DataEventType.value, with: { (snapshot) in
                                let Count = snapshot.value
                                var Countstr = Count as? String
                                if Countstr == nil {
                                    //存在しない場合、新規データ作成(countは0にする)
                                    self.ref.child("imgcount").child(self.userID!).setValue(["count": "0"])
                                    Countstr = "0"
                                } else {
                                    //UIScrollView初期設定
                                    let scView = UIScrollView(frame: CGRect(x: 0 , y: h2 - (h2 - 200), width: w2, height: h2 - 200))
                                    scView.isPagingEnabled = false
                                    scView.backgroundColor = .white
                                    //データから呼んだ値を、各変数にセットする
                                    var CountInt = Int(Countstr!) //数値化
                                    var CountValue = CountInt!   //強制アンラップ
                                    var CountUp = CountValue + 1  //カウントアップ
                                    //カウンタの初期設定
                                    let ud = UserDefaults.standard
                                    ud.set(CountUp, forKey: "count")
                                    //カウントダウン値
                                    var CountDown = CountValue
                                    //画像表示用UIImageView
                                    var ImgArray = [UIImageView](repeating: UIImageView(), count: CountValue + 1)

                                    //ダウンロードURLの存在確認
                                    if CountValue != 0 {
                                        for i in 1 ... CountValue {
                                            //ダウンロードURL取得
                                            let imageURL = self.ref.child("images/\(UIDstr!)/\(CountDown)/profile")
                                            ImgArray[i] = UIImageView(frame: CGRect(x: 0, y: CGFloat(newY), width: w2, height: w2))
                                            print(newY)
                                            print(imageURL)
                                            imageURL.observe(DataEventType.value, with: { (snapshot) in
                                                let url = snapshot.value as? String
                                                //ダウンロードURLを取得し、ImageViewに反映
                                                let strURL = URL(string: url!)
                                                //画像を配列に保存
                                                ImgArray[i].sd_setImage(with: strURL)
                                                scView.addSubview(ImgArray[i])
                                            })

                                            //高さを延ばす
                                            newY += Int(w2 + 50)
                                            scView.contentSize = CGSize(width: 0, height: newY)
                                            //カウントダウン
                                            CountDown -= 1
                                        }

                                        //処理後、初期値に戻す
                                        newY = 100
                                    } else {
                                        //アップロードボタン
                                        let add = UIButton(frame: CGRect(x: (w2 - 150) / 2, y: 150, width: 150, height: 30))
                                        //アップロードボタン設定
                                        add.backgroundColor = .red
                                        add.addTarget(self, action: #selector(ImageViewController.Imageadd(_:)), for: .touchUpInside)
                                        add.setTitle("アップロード", for: UIControlState())
                                        scView.addSubview(add)
                                    }

                                    self.view.addSubview(scView)

                                }

                                //imagesのデータの存在確認
                                let newUser = self.ref.child("images/\(UIDstr!)/\(Countstr!)/profile")
                                newUser.observe(DataEventType.value, with: { (snapshot) in
                                    let profile = snapshot.value as? String
                                    if profile == nil  {
                                        //データ値がない場合、新規データを作成
                                        self.ref = Database.database().reference()
                                        self.ref.child("images").updateChildValues(["\(self.userID!)": "userID"])
                                        print("新規ユーザー")

                                    } else {
                                        print("既存")
                                    }

                                })

                            })
                            print("ログインID")
                        } else {
                            print("不一致")
                        }

                    })
                }
            })
        }

② 完成品

・既に写真を投稿している場合
スクリーンショット 2018-03-09 0.20.20.png

・まだ投稿していない場合
スクリーンショット 2018-03-09 0.23.03.png

感想

今回の修正で、前回まで出来ていた画像の追加アップロードができなくなったので、
次回は、アップロードページを作りたいですね。

次回

【iOS】プログラミング素人の俺が、Swift + Firebaseを使って、インスタクローンを作る!【アップロードページ編】