LoginSignup
1
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-09

目次

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

今日やる事

アップロードページを作り、UITabbarでユーザページと画面遷移を行う。

・完成イメージ

・ ユーザページ

スクリーンショット 2018-03-09 16.45.02.png

・ アップロードページ

スクリーンショット 2018-03-09 16.45.15.png

アップロードページを作る

アップロードページは、写真投稿編画像リスト化編で作った機能を使用する。

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に入れて、表示領域を変更して書き直した。

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は、デフォルトの物を適当に使用した。(後々、変更予定。)

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. ユーザネーム&一言メッセージ追加ページ
各ページの詳細はこちら

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

・完成

・ ユーザページ

スクリーンショット 2018-03-09 16.45.02.png

・ アップロードページ

スクリーンショット 2018-03-09 16.45.15.png

未解決

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

感想

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

次回

【iOS】プログラミング素人の俺が、Swift + Firebaseを使って、インスタクローンを作る!【超簡易検索機能編】

1
1
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
1
1