目次
- 前回
- 今日やる事
- アップロードページを作る
- UITabBarを使って、アップロードページとユーザページを遷移させる
- 未解決
- 感想
- 次回
今日やる事
アップロードページを作り、UITabbarでユーザページと画面遷移を行う。
・完成イメージ
・ ユーザページ
・ アップロードページ
アップロードページを作る
アップロードページは、写真投稿編、画像リスト化編で作った機能を使用する。
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に入れて、表示領域を変更して書き直した。
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は、デフォルトの物を適当に使用した。(後々、変更予定。)
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のページに飛ばすように設定する。
・変更加えたページ
- 画面遷移処理ページ
- ユーザネーム&一言メッセージ追加ページ
各ページの詳細はこちら。
let storyboard: UIStoryboard = self.storyboard!
let nextView = storyboard.instantiateViewController(withIdentifier: "Home")
self.present(nextView, animated: true, completion: nil)
・完成
・ ユーザページ
・ アップロードページ
未解決
アップロードページから、写真をアップロードして画面がUITabBarに戻る時、
UITabBarのSelectedIndex値が0(一番左)にならない。
感想
未解決の問題が解決したら、理想的な画面遷移だったが、残念ながら文献が見つからず。。。。。。
とりあえず、解決に向けていろいろ調べてみます。
次回
【iOS】プログラミング素人の俺が、Swift + Firebaseを使って、インスタクローンを作る!【超簡易検索機能編】