LoginSignup
2
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-08

目次

  • 前回
  • 今回やる事
  • 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を使って、インスタクローンを作る!【ユーザページ完成編②】

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2