Xcode
Firebase
Swift4.0

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

目次

  • 前回
  • 今回やる事
  • Database
  • ログインしたユーザの情報によって遷移先を判別する画面遷移ページを作る
  • ユーザネーム&一言メッセージ追加ページを追加
  • 次回

前回

【iOS】プログラミング素人の俺が、Swift + Firebaseを使って、インスタクローンを作る!【画像リスト化編】

今回やる事

今回はユーザページを完成させる為に、ログインしたユーザの情報によって画面遷移先を変える処理やユーザネーム&一言メッセージ追加ページも付け加える。

画面遷移図

スクリーンショット 2018-03-08 19.07.00.png

Database

今回は、以下のDatabaseを追加
1. user
2. usercount

userは、以下のデータが入っている。
スクリーンショット 2018-03-08 19.11.35.png

(Follow/Followerに関しては、フォロー機能実装の際に使う)

usercountは、ユーザ数をカウントするものである。
スクリーンショット 2018-03-08 19.14.40.png

ログインしたユーザの情報によって遷移先を判別する画面遷移ページを追加

初めてログインした際に、遷移するページであり、このページでuserのデータを格納する。
まず、新規登録の処理を書き直す。

ViewController.swift
//新規登録
    @objc func add(_ :UIButton) {
        let usercount = self.ref.child("usercount/count")
        usercount.observe(DataEventType.value, with:{ (snapshot) in
            let count = snapshot.value
            let countStr = count as? String
            let countInt = Int(countStr!)
            let countValue = countInt!
            Auth.auth().createUser(withEmail: self.user_id.text!, password: self.user_pass.text!, completion: { (user:User?, error:Error?) in
                let countUp = countValue + 1
                if let error = error {
                    print("Creating the user failed! \(error)")
                    return
                }

                if let user = user {
                    print("user : \(user.email) has been created successfully.")
                    self.ref.child("usercount").setValue(["count": "\(countUp)"])
                    let usercount = self.ref.child("usercount/count")
                    usercount.observe(DataEventType.value, with: { (snapshot) in
                        let usercountStr = snapshot.value as? String
                        //userにデータを追加する
                        self.ref.child("user").child("\(usercountStr!)").updateChildValues(["UID": user.uid])
                        self.ref.child("user").child("\(usercountStr!)").updateChildValues(["Follow": "0"])
                        self.ref.child("user").child("\(usercountStr!)").updateChildValues(["Follower": "0"])
                        self.ref.child("user").child("\(usercountStr!)").updateChildValues(["images": user.uid])
                    })
                }
            })
        })

    }

新規登録の所にusercountの値を上書き処理を新たに追加した。
そして新規登録時に、userにデータ(usernameとmsg以外)を追加する。

続いて、ログインしたユーザの情報によって遷移先を判別する画面遷移ページを作る。

UserFlowViewController.swift
import UIKit
import Firebase
let w3 = UIScreen.main.bounds.size.width
let h3 = UIScreen.main.bounds.size.height

class UserFlowViewController: UIViewController {

    //DBアクセス
    var ref: DatabaseReference!

    override func viewDidLoad() {
        //DBインスタンスを作成
        ref = Database.database().reference()
        super.viewDidLoad()

        //usercount取得
        let UserListNum = self.ref.child("usercount/count")
        UserListNum.observe(DataEventType.value, with: { (snapshot) in
            //取得したusercountをIntに戻す
            let Usercount = snapshot.value as? String
            let UsercountInt = Int(Usercount!)
            let UserValue = UsercountInt!
            //ログイン情報取得
            let user = Auth.auth().currentUser

            for i in 1 ... UserValue {
                if let user = user {
                    //userのユーザUIDを取得する
                   let userData = self.ref.child("user/\(i)/username")
                   userData.observe(DataEventType.value, with: { (snapshot) in
                        let User = snapshot.value as? String
                        let userUID = self.ref.child("user/\(i)/UID")
                        userUID.observe(DataEventType.value, with: { (snapshot) in
                            let UID = snapshot.value as? String
                            if user.uid == UID! {
                                if User == nil {
                                    //ユーザネーム&一言メッセージに遷移
                                    let storyboard: UIStoryboard = self.storyboard!
                                    let nextView = storyboard.instantiateViewController(withIdentifier: "UsernameAdd")
                                    self.present(nextView, animated: true, completion: nil)
                                    print("User転送")
                                } else {
                                    //ユーザページに遷移
                                    let storyboard: UIStoryboard = self.storyboard!
                                    let nextView = storyboard.instantiateViewController(withIdentifier: "Image")
                                    self.present(nextView, animated: true, completion: nil)
                                    print("Image転送")
                                }
                            }
                        })

                   })
                }

            }

        })

    }
}


まず、userに登録されているユーザUIDとログインしたUIDが同じであり、
且つ、userのusernameがnilである場合は、ユーザネーム&一言メッセージ追加ページに遷移する。
これによって、初めてログインした人は、username未登録なのでnilとなり、ユーザネーム&一言メッセージに遷移、
過去にログインした事ある人は、そのままユーザページに遷移している。

ユーザネーム&一言メッセージ追加ページを追加

続いて、ユーザネーム&一言メッセージ追加ページを追加する。

UsernamemsgAddViewController.swift
import UIKit
import Firebase

let w4 = UIScreen.main.bounds.size.width
let h4 = UIScreen.main.bounds.size.height
class UsernamemsgAddViewController: UIViewController {
    //DB参照作成
    var ref: DatabaseReference!
    //ユーザUID取得
    let user = Auth.auth().currentUser?.uid
    //ユーザネーム入力欄
    let Username = UITextField(frame: CGRect(x: (w4 - 300) / 2, y: 100, width: 300, height: 50))
    //一言メッセージ入力欄
    let msg = UITextView(frame: CGRect(x: (w4 - 300) / 2, y: 200, width: 300, height: 200))
    override func viewDidLoad() {
        super.viewDidLoad()

        //ユーザネーム入力欄の設定
        Username.layer.cornerRadius = 5.0
        Username.layer.borderColor = UIColor.black.cgColor
        Username.layer.borderWidth = 1.0
        view.addSubview(Username)

        //一言メッセージ入力欄の設定
        msg.layer.cornerRadius = 5.0
        msg.layer.borderColor = UIColor.black.cgColor
        msg.layer.borderWidth = 1.0
        view.addSubview(msg)


        //始めるボタン
        let b = UIButton(frame: CGRect(x: (w4 - 100) / 2, y: 500, width: 100, height: 50))
        b.setTitle("始める", for: UIControlState())
        b.backgroundColor = .red
        b.addTarget(self, action: #selector(UsernamemsgAddViewController.UsernameMsg(_:)), for: .touchUpInside)
        view.addSubview(b)
    }

    //始めるボタン押した時に、データを格納&ユーザページに遷移する
    @objc func UsernameMsg(_ :UIButton) {
        //DBインスタンス作成
        ref = Database.database().reference()
        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 i in 1 ... usercountInt! {
                let userUID = self.ref.child("user/\(i)/UID")
                userUID.observe(DataEventType.value, with: { (snapshot) in
                    let UID = snapshot.value as? String
                    if self.user! == UID {
                        self.ref.child("user").child("\(i)").updateChildValues(["username": "\(self.Username.text!)"])
                        self.ref.child("user").child("\(i)").updateChildValues(["msg": "\(self.msg.text!)"])
                        let storyboard: UIStoryboard = self.storyboard!
                        let nextView = storyboard.instantiateViewController(withIdentifier: "Image")
                        self.present(nextView, animated: true, completion: nil)
                    }
                })

            }

        })
    }

}

・完成品

スクリーンショット 2018-03-08 19.59.12.png

・・・次回に続く。

次回

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