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

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

# **前回**
[【iOS】プログラミング素人の俺が、Swift + Firebaseを使って、インスタクローンを作る！【画像リスト化編】](https://qiita.com/umagoro/items/a0094fd1eb74ed542077)

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

###**画面遷移図**
<img width="1178" alt="スクリーンショット 2018-03-08 19.07.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/154610/e651a26b-7dc0-188a-88b2-517852f6800f.png">

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

userは、以下のデータが入っている。
<img width="440" alt="スクリーンショット 2018-03-08 19.11.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/154610/0b17ac20-15fd-b325-3788-519af6b83ce5.png">

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

usercountは、ユーザ数をカウントするものである。
<img width="189" alt="スクリーンショット 2018-03-08 19.14.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/154610/9d237e3e-435a-1605-9b77-9d8cf1edb198.png">


# **ログインしたユーザの情報によって遷移先を判別する画面遷移ページを追加**
初めてログインした際に、遷移するページであり、このページでuserのデータを格納する。
まず、新規登録の処理を書き直す。

```swift: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以外)を追加する。

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

```swift: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となり、ユーザネーム&一言メッセージに遷移、
過去にログインした事ある人は、そのままユーザページに遷移している。

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

```swift: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)
                    }
                })
                
            }
            
        })
    }

}

```

### **・完成品**
<img width="403" alt="スクリーンショット 2018-03-08 19.59.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/154610/59c85192-2167-07f9-41cd-f3d48fc81e0b.png">


・・・次回に続く。

# **次回**
[【iOS】プログラミング素人の俺が、Swift + Firebaseを使って、インスタクローンを作る！【ユーザページ完成編②】](https://qiita.com/umagoro/items/8a0f094f134a55b0ca8e)