Written by
Amy
on
on
인스타그램 만들기 v0.2
인스타그램 핵심 기능을 구현해보자.
기능 Spec
- Firebase 서버를 이용한 로그인, 회원가입, DB 관리
- 핵심기능1. 로그인/회원가입
- 핵심기능2. 이미지 + 텍스트 함께 포스팅
- 핵심기능3. 포스팅한 내용을 그리드뷰/리스트뷰로 피드 제공
- 부가기능1. 유저 프로필 수정 및 포스트 라이크 기능
- 부가기능2. 코멘트 남기기
Main TabBar Controller
- 앱의 가장 root가 되는 뷰콘이다.
- 로그인 여부를 체크해서, 로그인이 되있지 않다면
self.present(loginNavi, animated: true, completion: nil)
- 로그인이 되어있다면
setUpTabBarController()
import UIKit
import Firebase
import FirebaseAuth
class MainTabBarController: UITabBarController, UITabBarControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self,
selector: #selector(setUpTabBarController),
name: NSNotification.Name.userLogined,
object: nil)
// Login Check : if false -> present LoginVC
if !checkLogin() {
DispatchQueue.main.async {
let loginVC = UIStoryboard.main.makeLoginVC()
let loginNavi = UINavigationController(rootViewController: loginVC)
self.present(loginNavi, animated: true, completion: nil)
}
}else {
setUpTabBarController()
}
}
@objc private func setUpTabBarController() {
App.api.fetchUser(handler: { [weak self] (isSuccess) in
if isSuccess {
self?.delegate = self // UITabBarControllerDelegate
self?.setupViewControllers()
}else {
print("fail to fetch user")
}
})
}
private func setupViewControllers() {
// MARK - Tab 01 : myHome
let myHomeTab = MyHomeController()
myHomeTab.tabIndexType = .MyHome
let myHomeNavi = templateNaviController(title: "My Home",
unselectedImage: #imageLiteral(resourceName: "Feed_Off"),
selectedImage: #imageLiteral(resourceName: "Feed_On"),
rootViewController: myHomeTab)
myHomeTab.navigationItem.title = "Onstagram"
// MARK - Tab 02 : addPost
let addPostTab = OnstagramController()
addPostTab.tabIndexType = .AddPost
addPostTab.tabBarItem = UITabBarItem(title: "New Post",
image: #imageLiteral(resourceName: "Camera_Off"),
selectedImage: #imageLiteral(resourceName: "Camera_On"))
tabBar.tintColor = .black
self.viewControllers = [myHomeNavi,addPostTab]
}
// MARK: - Present imagePickTab modally
func tabBarController(_ tabBarController: UITabBarController,
shouldSelect viewController: UIViewController) -> Bool {
let type = (viewController as? OnstagramController)?.tabIndexType
switch type {
case .AddPost?:
let imagePickTab = PhotoSelectorController()
imagePickTab.pickerType = .NewPostPicker
let navi = UINavigationController(rootViewController: imagePickTab)
self.present(navi, animated: true, completion: nil)
return false
default:
break
}
return true
}
// MARK: - templateNaviController
fileprivate func templateNaviController(title: String,
unselectedImage: UIImage,
selectedImage: UIImage,
rootViewController: UIViewController) -> UINavigationController {
let viewController = rootViewController
let navController = UINavigationController(rootViewController: viewController)
navController.tabBarItem.image = unselectedImage
navController.tabBarItem.selectedImage = selectedImage
navController.tabBarItem.title = title
return navController
}
// MARK: - checkLogin
fileprivate func checkLogin() -> Bool {
if Auth.auth().currentUser == nil {
return false
}else {
return true
}
}
}
OnstagramController
- 탭바에 전시되는 뷰콘들은 기본적으로 OnstagramController를 상속받고 있다. 탭에 따라 기능을 분기하기 위해 Type을 주었다.
enum TabItemControllerType {
case MyHome
case AddPost
}
class OnstagramController: UIViewController {
var tabIndexType: TabItemControllerType?
override func viewDidLoad() {
super.viewDidLoad()
}
}