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

# **目次**
- 前回
- 今日やる事
- アップロードページを作る
- UITabBarを使って、アップロードページとユーザページを遷移させる
- 未解決
- 感想
- 次回

# **今日やる事**
アップロードページを作り、UITabbarでユーザページと画面遷移を行う。

### **・完成イメージ**
**・ ユーザページ**


<img width="411" alt="スクリーンショット 2018-03-09 16.45.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/154610/3964d28d-cc7c-480d-e51e-960c64ff69a2.png">


**・ アップロードページ**


<img width="403" alt="スクリーンショット 2018-03-09 16.45.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/154610/03dc24f5-897e-849a-1a35-36edf7e7064e.png">


# **アップロードページを作る**
アップロードページは、[写真投稿編](https://qiita.com/umagoro/items/3e86c0aa9306775d5731)、[画像リスト化編](https://qiita.com/umagoro/items/a0094fd1eb74ed542077)で作った機能を使用する。

```swift:UploadViewController.swift
import UIKit
import Firebase

let w5 = UIScreen.main.bounds.size.width
let h5 = UIScreen.main.bounds.size.height

class UploadViewController: UIViewController {
    //DB参照作成
    var ref: DatabaseReference!
    //ユーザーUID取得
    let userID = Auth.auth().currentUser?.uid
    override func viewDidLoad() {
        super.viewDidLoad()
        //DBインスタンス作成
        ref = Database.database().reference()
        
        let user = Auth.auth().currentUser
        if let user = user {
            //UIScrollView初期設定
            let scView = UIScrollView(frame: CGRect(x: 0 , y: 0, width: w2, height: h2))
            scView.backgroundColor = .white
            scView.isPagingEnabled = false
            //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! {
                            //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 {
                                    //データから呼んだ値を、各変数にセットする
                                    var CountInt = Int(Countstr!) //数値化
                                    var CountValue = CountInt!   //強制アンラップ
                                    var CountUp = CountValue + 1  //カウントアップ
                                    //カウンタの初期設定
                                    let ud = UserDefaults.standard
                                    ud.set(CountUp, forKey: "count")
                                    
                                    //アップロードボタン
                                    let add = UIButton(frame: CGRect(x: (w2 - 150) / 2, y: (h2 - 30) / 2, 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("不一致")
                        }
                    })
                }
                
            })
            view.addSubview(scView)
        }
        
        
        
    }
    
    ///アルバム呼び出し
    @objc func Imageadd(_ : UIButton) {
        pickImageFromLibrary()
    }
    
    //カウンタ
    func countPhoto() -> String {
        let ud = UserDefaults.standard
        let count = ud.object(forKey: "count") as! Int
        ud.set(count + 1, forKey: "count")
        return String(count)
    }
}

//アルバムにアクセス
extension UploadViewController: UINavigationControllerDelegate {
    func pickImageFromLibrary() {
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) {
            let controller = UIImagePickerController()
            controller.delegate = self
            controller.sourceType = UIImagePickerControllerSourceType.photoLibrary
            
            present(controller, animated: true, completion: nil)
        }
    }
}

//Storageに書き込み
extension UploadViewController: UIImagePickerControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo
        info: [String : Any]) {
        let storage = Storage.storage()
        let storageRef = storage.reference()
        let user = Auth.auth().currentUser
        if let user = user {
            count = countPhoto()
            if let data = UIImagePNGRepresentation(info[UIImagePickerControllerOriginalImage] as! UIImage) {
                let reference = storageRef.child("image/" + user.uid + "/" + count + ".jpeg")
                let meta = StorageMetadata()
                meta.contentType = "image/jpeg"
                reference.putData(data, metadata: meta, completion: { metaData, error in
                    if (error != nil) {
                        print("Uh-oh, an error occurred!")
                    } else {
                        //URL型をNSstring型に変更
                        let downloadURL = metaData!.downloadURL()
                        
                        let data = downloadURL!.absoluteString
                        self.ref = Database.database().reference()
                        self.ref.child("images").child(self.userID!).child(count).updateChildValues(["profile": data])
                        self.ref.child("imgcount").child(self.userID!).setValue(["count": count])
                        print("成功！")
                    }
                })
                
                dismiss(animated: true, completion: nil)
            }
        }
    }
    
}

```

# **UITabBarを使って、アップロードページとユーザページを遷移させる**
本日の難関。
アップロードページとユーザページをUITabBarを使って、遷移させるが、なぜか、背景(UIViewControllerを使用している部分)が真っ黒になってしまうので、
ユーザページを、ユーザネームと一言メッセージをUIScrollViewに入れて、表示領域を変更して書き直した。

```swift:ImageViewController
 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! {
                            //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: 0, width: w2, height: h2))
                                    scView.backgroundColor = .white
                                    scView.isPagingEnabled = false
                                    //ユーザネームと一言メッセージを取得
                                    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
                                        scView.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
                                        scView.addSubview(usermsgLabel)
                                    })

```
(変更部分のみ抜粋)


そして、新規ファイルにUITabBarを実装する。
今回、UITabBarItemは、デフォルトの物を適当に使用した。(後々、変更予定。)

```swift:UserViewController.swift
import UIKit


class UserViewController: UITabBarController {
    override func viewDidLoad() {
        super.viewDidLoad()
        var viewControllers: [UIViewController] = []
        
        let firstViewController = ImageViewController()
        firstViewController.tabBarItem = UITabBarItem(tabBarSystemItem: UITabBarSystemItem.history, tag: 1)
        viewControllers.append(firstViewController)
        
        let secondViewController = UploadViewController()
        secondViewController.tabBarItem = UITabBarItem(tabBarSystemItem: UITabBarSystemItem.downloads, tag: 2)
        viewControllers.append(secondViewController)
        
        
        self.setViewControllers(viewControllers, animated: false)
        
        self.selectedIndex = 0
        
    }
    
}

```


次に、以下の文を入れて、ログインしたらUITabBarのページに飛ばすように設定する。

**・変更加えたページ**
1. 画面遷移処理ページ
2. ユーザネーム&一言メッセージ追加ページ
各ページの詳細は[こちら](https://qiita.com/umagoro/items/a00ba729e5bb350c4f3c)。

```swift
let storyboard: UIStoryboard = self.storyboard!
let nextView = storyboard.instantiateViewController(withIdentifier: "Home")
self.present(nextView, animated: true, completion: nil)
```


### **・完成**
**・ ユーザページ**


<img width="411" alt="スクリーンショット 2018-03-09 16.45.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/154610/3964d28d-cc7c-480d-e51e-960c64ff69a2.png">


**・ アップロードページ**


<img width="403" alt="スクリーンショット 2018-03-09 16.45.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/154610/03dc24f5-897e-849a-1a35-36edf7e7064e.png">

# **未解決**

アップロードページから、写真をアップロードして画面がUITabBarに戻る時、
UITabBarのSelectedIndex値が0(一番左)にならない。

# **感想**
未解決の問題が解決したら、理想的な画面遷移だったが、残念ながら文献が見つからず。。。。。。
とりあえず、解決に向けていろいろ調べてみます。

# **次回**
[【iOS】プログラミング素人の俺が、Swift + Firebaseを使って、インスタクローンを作る！【超簡易検索機能編】](https://qiita.com/umagoro/items/eaf6ac1723bbe4bb4e91)