diff --git a/BaseMVC.xcodeproj/project.pbxproj b/BaseMVC.xcodeproj/project.pbxproj index 174e906..9e13a43 100644 --- a/BaseMVC.xcodeproj/project.pbxproj +++ b/BaseMVC.xcodeproj/project.pbxproj @@ -11,22 +11,6 @@ 8234BE651EF9887D009A5DE5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE231EF9887D009A5DE5 /* AppDelegate.swift */; }; 8234BE661EF9887D009A5DE5 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE251EF9887D009A5DE5 /* BaseViewController.swift */; }; 8234BE6B1EF9887D009A5DE5 /* StartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE2A1EF9887D009A5DE5 /* StartViewController.swift */; }; - 8234BE6D1EF9887D009A5DE5 /* Color+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE2D1EF9887D009A5DE5 /* Color+Ext.swift */; }; - 8234BE6E1EF9887D009A5DE5 /* Date+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE2E1EF9887D009A5DE5 /* Date+Ext.swift */; }; - 8234BE6F1EF9887D009A5DE5 /* String+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE2F1EF9887D009A5DE5 /* String+Ext.swift */; }; - 8234BE701EF9887D009A5DE5 /* UITableView+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE301EF9887D009A5DE5 /* UITableView+Ext.swift */; }; - 8234BE711EF9887D009A5DE5 /* UIView+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE311EF9887D009A5DE5 /* UIView+Ext.swift */; }; - 8234BE721EF9887D009A5DE5 /* UIViewController+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE321EF9887D009A5DE5 /* UIViewController+Ext.swift */; }; - 8234BE731EF9887D009A5DE5 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE341EF9887D009A5DE5 /* Config.swift */; }; - 8234BE741EF9887D009A5DE5 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE351EF9887D009A5DE5 /* Constants.swift */; }; - 8234BE751EF9887D009A5DE5 /* EnumDefine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE361EF9887D009A5DE5 /* EnumDefine.swift */; }; - 8234BE761EF9887D009A5DE5 /* Func.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE371EF9887D009A5DE5 /* Func.swift */; }; - 8234BE771EF9887D009A5DE5 /* Keys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE381EF9887D009A5DE5 /* Keys.swift */; }; - 8234BE781EF9887D009A5DE5 /* LocalizableString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE391EF9887D009A5DE5 /* LocalizableString.swift */; }; - 8234BE791EF9887D009A5DE5 /* StructDefine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE3A1EF9887D009A5DE5 /* StructDefine.swift */; }; - 8234BE7A1EF9887D009A5DE5 /* ViewDefine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE3B1EF9887D009A5DE5 /* ViewDefine.swift */; }; - 8234BE7B1EF9887D009A5DE5 /* Animator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE3E1EF9887D009A5DE5 /* Animator.swift */; }; - 8234BE7C1EF9887D009A5DE5 /* RealmManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE3F1EF9887D009A5DE5 /* RealmManager.swift */; }; 8234BE7E1EF9887D009A5DE5 /* RStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE421EF9887D009A5DE5 /* RStore.swift */; }; 8234BE7F1EF9887D009A5DE5 /* RUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE431EF9887D009A5DE5 /* RUser.swift */; }; 8234BE801EF9887D009A5DE5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8234BE451EF9887D009A5DE5 /* Assets.xcassets */; }; @@ -36,6 +20,29 @@ 8234BE841EF9887D009A5DE5 /* OAuthHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8234BE4C1EF9887D009A5DE5 /* OAuthHandler.swift */; }; 8234BE861EF9887D009A5DE5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8234BE501EF9887D009A5DE5 /* LaunchScreen.storyboard */; }; 8234BE881EF9887D009A5DE5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8234BE541EF9887D009A5DE5 /* Main.storyboard */; }; + 825778691EFAC78C0057DACB /* MainTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 825778681EFAC78C0057DACB /* MainTabBarController.swift */; }; + 8257786B1EFACA470057DACB /* User.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8257786A1EFACA470057DACB /* User.storyboard */; }; + 8257786D1EFACAA60057DACB /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8257786C1EFACAA60057DACB /* LoginViewController.swift */; }; + 825778701EFACC5C0057DACB /* Timeline.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8257786F1EFACC5C0057DACB /* Timeline.storyboard */; }; + 825778721EFACC760057DACB /* Message.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 825778711EFACC760057DACB /* Message.storyboard */; }; + 82A3D5891F000AFE009BFB2E /* Color+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D57F1F000AFE009BFB2E /* Color+Ext.swift */; }; + 82A3D58A1F000AFE009BFB2E /* Date+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D5801F000AFE009BFB2E /* Date+Ext.swift */; }; + 82A3D58B1F000AFE009BFB2E /* String+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D5811F000AFE009BFB2E /* String+Ext.swift */; }; + 82A3D58C1F000AFE009BFB2E /* UITableView+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D5821F000AFE009BFB2E /* UITableView+Ext.swift */; }; + 82A3D58D1F000AFE009BFB2E /* UIView+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D5831F000AFE009BFB2E /* UIView+Ext.swift */; }; + 82A3D58E1F000AFE009BFB2E /* UIViewController+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D5841F000AFE009BFB2E /* UIViewController+Ext.swift */; }; + 82A3D58F1F000AFE009BFB2E /* LocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D5861F000AFE009BFB2E /* LocationManager.swift */; }; + 82A3D5901F000AFE009BFB2E /* RealmManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D5871F000AFE009BFB2E /* RealmManager.swift */; }; + 82A3D5911F000AFE009BFB2E /* TransitionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D5881F000AFE009BFB2E /* TransitionManager.swift */; }; + 82A3D59D1F000B42009BFB2E /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D5951F000B42009BFB2E /* Config.swift */; }; + 82A3D59E1F000B42009BFB2E /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D5961F000B42009BFB2E /* Constants.swift */; }; + 82A3D59F1F000B42009BFB2E /* EnumDefine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D5971F000B42009BFB2E /* EnumDefine.swift */; }; + 82A3D5A01F000B42009BFB2E /* Func.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D5981F000B42009BFB2E /* Func.swift */; }; + 82A3D5A11F000B42009BFB2E /* Keys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D5991F000B42009BFB2E /* Keys.swift */; }; + 82A3D5A21F000B42009BFB2E /* LocalizableString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D59A1F000B42009BFB2E /* LocalizableString.swift */; }; + 82A3D5A31F000B42009BFB2E /* StructDefine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D59B1F000B42009BFB2E /* StructDefine.swift */; }; + 82A3D5A41F000B42009BFB2E /* ViewDefine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A3D59C1F000B42009BFB2E /* ViewDefine.swift */; }; + 82B455C31EFE5F2C0099161D /* UserDao.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82B455C21EFE5F2C0099161D /* UserDao.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -47,22 +54,6 @@ 8234BE231EF9887D009A5DE5 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 8234BE251EF9887D009A5DE5 /* BaseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; 8234BE2A1EF9887D009A5DE5 /* StartViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StartViewController.swift; sourceTree = ""; }; - 8234BE2D1EF9887D009A5DE5 /* Color+Ext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Color+Ext.swift"; sourceTree = ""; }; - 8234BE2E1EF9887D009A5DE5 /* Date+Ext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Date+Ext.swift"; sourceTree = ""; }; - 8234BE2F1EF9887D009A5DE5 /* String+Ext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Ext.swift"; sourceTree = ""; }; - 8234BE301EF9887D009A5DE5 /* UITableView+Ext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITableView+Ext.swift"; sourceTree = ""; }; - 8234BE311EF9887D009A5DE5 /* UIView+Ext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+Ext.swift"; sourceTree = ""; }; - 8234BE321EF9887D009A5DE5 /* UIViewController+Ext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewController+Ext.swift"; sourceTree = ""; }; - 8234BE341EF9887D009A5DE5 /* Config.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = ""; }; - 8234BE351EF9887D009A5DE5 /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; - 8234BE361EF9887D009A5DE5 /* EnumDefine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnumDefine.swift; sourceTree = ""; }; - 8234BE371EF9887D009A5DE5 /* Func.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Func.swift; sourceTree = ""; }; - 8234BE381EF9887D009A5DE5 /* Keys.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Keys.swift; sourceTree = ""; }; - 8234BE391EF9887D009A5DE5 /* LocalizableString.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalizableString.swift; sourceTree = ""; }; - 8234BE3A1EF9887D009A5DE5 /* StructDefine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StructDefine.swift; sourceTree = ""; }; - 8234BE3B1EF9887D009A5DE5 /* ViewDefine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewDefine.swift; sourceTree = ""; }; - 8234BE3E1EF9887D009A5DE5 /* Animator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Animator.swift; sourceTree = ""; }; - 8234BE3F1EF9887D009A5DE5 /* RealmManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RealmManager.swift; sourceTree = ""; }; 8234BE421EF9887D009A5DE5 /* RStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RStore.swift; sourceTree = ""; }; 8234BE431EF9887D009A5DE5 /* RUser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RUser.swift; sourceTree = ""; }; 8234BE451EF9887D009A5DE5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -73,6 +64,29 @@ 8234BE4C1EF9887D009A5DE5 /* OAuthHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OAuthHandler.swift; sourceTree = ""; }; 8234BE511EF9887D009A5DE5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 8234BE551EF9887D009A5DE5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 825778681EFAC78C0057DACB /* MainTabBarController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainTabBarController.swift; sourceTree = ""; }; + 8257786A1EFACA470057DACB /* User.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = User.storyboard; sourceTree = ""; }; + 8257786C1EFACAA60057DACB /* LoginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; + 8257786F1EFACC5C0057DACB /* Timeline.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Timeline.storyboard; sourceTree = ""; }; + 825778711EFACC760057DACB /* Message.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Message.storyboard; sourceTree = ""; }; + 82A3D57F1F000AFE009BFB2E /* Color+Ext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Color+Ext.swift"; sourceTree = ""; }; + 82A3D5801F000AFE009BFB2E /* Date+Ext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Date+Ext.swift"; sourceTree = ""; }; + 82A3D5811F000AFE009BFB2E /* String+Ext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Ext.swift"; sourceTree = ""; }; + 82A3D5821F000AFE009BFB2E /* UITableView+Ext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITableView+Ext.swift"; sourceTree = ""; }; + 82A3D5831F000AFE009BFB2E /* UIView+Ext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+Ext.swift"; sourceTree = ""; }; + 82A3D5841F000AFE009BFB2E /* UIViewController+Ext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewController+Ext.swift"; sourceTree = ""; }; + 82A3D5861F000AFE009BFB2E /* LocationManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationManager.swift; sourceTree = ""; }; + 82A3D5871F000AFE009BFB2E /* RealmManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RealmManager.swift; sourceTree = ""; }; + 82A3D5881F000AFE009BFB2E /* TransitionManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransitionManager.swift; sourceTree = ""; }; + 82A3D5951F000B42009BFB2E /* Config.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = ""; }; + 82A3D5961F000B42009BFB2E /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + 82A3D5971F000B42009BFB2E /* EnumDefine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnumDefine.swift; sourceTree = ""; }; + 82A3D5981F000B42009BFB2E /* Func.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Func.swift; sourceTree = ""; }; + 82A3D5991F000B42009BFB2E /* Keys.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Keys.swift; sourceTree = ""; }; + 82A3D59A1F000B42009BFB2E /* LocalizableString.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalizableString.swift; sourceTree = ""; }; + 82A3D59B1F000B42009BFB2E /* StructDefine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StructDefine.swift; sourceTree = ""; }; + 82A3D59C1F000B42009BFB2E /* ViewDefine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewDefine.swift; sourceTree = ""; }; + 82B455C21EFE5F2C0099161D /* UserDao.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserDao.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -129,11 +143,10 @@ 8234BE231EF9887D009A5DE5 /* AppDelegate.swift */, 8234BE441EF9887D009A5DE5 /* Resources */, 8234BE331EF9887D009A5DE5 /* Helpers */, - 8234BE2C1EF9887D009A5DE5 /* Extensions */, 8234BE3C1EF9887D009A5DE5 /* Libraries */, - 8234BE3D1EF9887D009A5DE5 /* Manager */, - 8234BE401EF9887D009A5DE5 /* Models */, 8234BE491EF9887D009A5DE5 /* Services */, + 82B455C11EFE5F100099161D /* Dao */, + 8234BE401EF9887D009A5DE5 /* Models */, 8234BE4D1EF9887D009A5DE5 /* Views */, 8234BE241EF9887D009A5DE5 /* Controllers */, ); @@ -144,34 +157,17 @@ isa = PBXGroup; children = ( 82F485B01EF98C81008D82A9 /* Main */, + 8257786E1EFACAAC0057DACB /* User */, ); path = Controllers; sourceTree = ""; }; - 8234BE2C1EF9887D009A5DE5 /* Extensions */ = { - isa = PBXGroup; - children = ( - 8234BE2D1EF9887D009A5DE5 /* Color+Ext.swift */, - 8234BE2E1EF9887D009A5DE5 /* Date+Ext.swift */, - 8234BE2F1EF9887D009A5DE5 /* String+Ext.swift */, - 8234BE301EF9887D009A5DE5 /* UITableView+Ext.swift */, - 8234BE311EF9887D009A5DE5 /* UIView+Ext.swift */, - 8234BE321EF9887D009A5DE5 /* UIViewController+Ext.swift */, - ); - path = Extensions; - sourceTree = ""; - }; 8234BE331EF9887D009A5DE5 /* Helpers */ = { isa = PBXGroup; children = ( - 8234BE341EF9887D009A5DE5 /* Config.swift */, - 8234BE351EF9887D009A5DE5 /* Constants.swift */, - 8234BE361EF9887D009A5DE5 /* EnumDefine.swift */, - 8234BE371EF9887D009A5DE5 /* Func.swift */, - 8234BE381EF9887D009A5DE5 /* Keys.swift */, - 8234BE391EF9887D009A5DE5 /* LocalizableString.swift */, - 8234BE3A1EF9887D009A5DE5 /* StructDefine.swift */, - 8234BE3B1EF9887D009A5DE5 /* ViewDefine.swift */, + 82A3D5941F000B42009BFB2E /* Define */, + 82A3D57E1F000AFE009BFB2E /* Extensions */, + 82A3D5851F000AFE009BFB2E /* Managers */, ); path = Helpers; sourceTree = ""; @@ -183,15 +179,6 @@ path = Libraries; sourceTree = ""; }; - 8234BE3D1EF9887D009A5DE5 /* Manager */ = { - isa = PBXGroup; - children = ( - 8234BE3E1EF9887D009A5DE5 /* Animator.swift */, - 8234BE3F1EF9887D009A5DE5 /* RealmManager.swift */, - ); - path = Manager; - sourceTree = ""; - }; 8234BE401EF9887D009A5DE5 /* Models */ = { isa = PBXGroup; children = ( @@ -215,25 +202,91 @@ isa = PBXGroup; children = ( 8234BE4A1EF9887D009A5DE5 /* ApiClient.swift */, - 8234BE4B1EF9887D009A5DE5 /* AppRouter.swift */, 8234BE4C1EF9887D009A5DE5 /* OAuthHandler.swift */, + 8234BE4B1EF9887D009A5DE5 /* AppRouter.swift */, ); path = Services; sourceTree = ""; }; 8234BE4D1EF9887D009A5DE5 /* Views */ = { + isa = PBXGroup; + children = ( + 825778671EFAC75D0057DACB /* Storyboards */, + ); + path = Views; + sourceTree = ""; + }; + 825778671EFAC75D0057DACB /* Storyboards */ = { isa = PBXGroup; children = ( 8234BE501EF9887D009A5DE5 /* LaunchScreen.storyboard */, 8234BE541EF9887D009A5DE5 /* Main.storyboard */, + 8257786A1EFACA470057DACB /* User.storyboard */, + 8257786F1EFACC5C0057DACB /* Timeline.storyboard */, + 825778711EFACC760057DACB /* Message.storyboard */, ); - path = Views; + name = Storyboards; + sourceTree = ""; + }; + 8257786E1EFACAAC0057DACB /* User */ = { + isa = PBXGroup; + children = ( + 8257786C1EFACAA60057DACB /* LoginViewController.swift */, + ); + name = User; + sourceTree = ""; + }; + 82A3D57E1F000AFE009BFB2E /* Extensions */ = { + isa = PBXGroup; + children = ( + 82A3D57F1F000AFE009BFB2E /* Color+Ext.swift */, + 82A3D5801F000AFE009BFB2E /* Date+Ext.swift */, + 82A3D5811F000AFE009BFB2E /* String+Ext.swift */, + 82A3D5821F000AFE009BFB2E /* UITableView+Ext.swift */, + 82A3D5831F000AFE009BFB2E /* UIView+Ext.swift */, + 82A3D5841F000AFE009BFB2E /* UIViewController+Ext.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + 82A3D5851F000AFE009BFB2E /* Managers */ = { + isa = PBXGroup; + children = ( + 82A3D5861F000AFE009BFB2E /* LocationManager.swift */, + 82A3D5871F000AFE009BFB2E /* RealmManager.swift */, + 82A3D5881F000AFE009BFB2E /* TransitionManager.swift */, + ); + path = Managers; + sourceTree = ""; + }; + 82A3D5941F000B42009BFB2E /* Define */ = { + isa = PBXGroup; + children = ( + 82A3D5951F000B42009BFB2E /* Config.swift */, + 82A3D5961F000B42009BFB2E /* Constants.swift */, + 82A3D5971F000B42009BFB2E /* EnumDefine.swift */, + 82A3D5981F000B42009BFB2E /* Func.swift */, + 82A3D5991F000B42009BFB2E /* Keys.swift */, + 82A3D59A1F000B42009BFB2E /* LocalizableString.swift */, + 82A3D59B1F000B42009BFB2E /* StructDefine.swift */, + 82A3D59C1F000B42009BFB2E /* ViewDefine.swift */, + ); + path = Define; + sourceTree = ""; + }; + 82B455C11EFE5F100099161D /* Dao */ = { + isa = PBXGroup; + children = ( + 82B455C21EFE5F2C0099161D /* UserDao.swift */, + ); + path = Dao; sourceTree = ""; }; 82F485B01EF98C81008D82A9 /* Main */ = { isa = PBXGroup; children = ( 8234BE251EF9887D009A5DE5 /* BaseViewController.swift */, + 825778681EFAC78C0057DACB /* MainTabBarController.swift */, 8234BE2A1EF9887D009A5DE5 /* StartViewController.swift */, ); name = Main; @@ -311,9 +364,12 @@ buildActionMask = 2147483647; files = ( 8234BE801EF9887D009A5DE5 /* Assets.xcassets in Resources */, + 825778701EFACC5C0057DACB /* Timeline.storyboard in Resources */, + 8257786B1EFACA470057DACB /* User.storyboard in Resources */, 8234BE861EF9887D009A5DE5 /* LaunchScreen.storyboard in Resources */, 8234BE881EF9887D009A5DE5 /* Main.storyboard in Resources */, 8234BE811EF9887D009A5DE5 /* Localizable.strings in Resources */, + 825778721EFACC760057DACB /* Message.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -386,30 +442,34 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 82A3D58C1F000AFE009BFB2E /* UITableView+Ext.swift in Sources */, + 82A3D5A41F000B42009BFB2E /* ViewDefine.swift in Sources */, + 82A3D59F1F000B42009BFB2E /* EnumDefine.swift in Sources */, + 82A3D59E1F000B42009BFB2E /* Constants.swift in Sources */, + 82A3D5A31F000B42009BFB2E /* StructDefine.swift in Sources */, 8234BE6B1EF9887D009A5DE5 /* StartViewController.swift in Sources */, - 8234BE731EF9887D009A5DE5 /* Config.swift in Sources */, 8234BE7F1EF9887D009A5DE5 /* RUser.swift in Sources */, - 8234BE791EF9887D009A5DE5 /* StructDefine.swift in Sources */, - 8234BE781EF9887D009A5DE5 /* LocalizableString.swift in Sources */, + 82B455C31EFE5F2C0099161D /* UserDao.swift in Sources */, 8234BE821EF9887D009A5DE5 /* ApiClient.swift in Sources */, - 8234BE761EF9887D009A5DE5 /* Func.swift in Sources */, - 8234BE721EF9887D009A5DE5 /* UIViewController+Ext.swift in Sources */, - 8234BE751EF9887D009A5DE5 /* EnumDefine.swift in Sources */, - 8234BE771EF9887D009A5DE5 /* Keys.swift in Sources */, - 8234BE6D1EF9887D009A5DE5 /* Color+Ext.swift in Sources */, + 82A3D58D1F000AFE009BFB2E /* UIView+Ext.swift in Sources */, + 82A3D5891F000AFE009BFB2E /* Color+Ext.swift in Sources */, + 82A3D5A01F000B42009BFB2E /* Func.swift in Sources */, + 82A3D58F1F000AFE009BFB2E /* LocationManager.swift in Sources */, + 82A3D58B1F000AFE009BFB2E /* String+Ext.swift in Sources */, + 82A3D5901F000AFE009BFB2E /* RealmManager.swift in Sources */, + 82A3D5911F000AFE009BFB2E /* TransitionManager.swift in Sources */, 8234BE651EF9887D009A5DE5 /* AppDelegate.swift in Sources */, + 82A3D58A1F000AFE009BFB2E /* Date+Ext.swift in Sources */, 8234BE841EF9887D009A5DE5 /* OAuthHandler.swift in Sources */, - 8234BE741EF9887D009A5DE5 /* Constants.swift in Sources */, 8234BE661EF9887D009A5DE5 /* BaseViewController.swift in Sources */, 8234BE7E1EF9887D009A5DE5 /* RStore.swift in Sources */, - 8234BE7C1EF9887D009A5DE5 /* RealmManager.swift in Sources */, - 8234BE711EF9887D009A5DE5 /* UIView+Ext.swift in Sources */, - 8234BE701EF9887D009A5DE5 /* UITableView+Ext.swift in Sources */, - 8234BE6E1EF9887D009A5DE5 /* Date+Ext.swift in Sources */, - 8234BE6F1EF9887D009A5DE5 /* String+Ext.swift in Sources */, - 8234BE7B1EF9887D009A5DE5 /* Animator.swift in Sources */, + 825778691EFAC78C0057DACB /* MainTabBarController.swift in Sources */, + 82A3D59D1F000B42009BFB2E /* Config.swift in Sources */, + 82A3D5A21F000B42009BFB2E /* LocalizableString.swift in Sources */, 8234BE831EF9887D009A5DE5 /* AppRouter.swift in Sources */, - 8234BE7A1EF9887D009A5DE5 /* ViewDefine.swift in Sources */, + 82A3D58E1F000AFE009BFB2E /* UIViewController+Ext.swift in Sources */, + 8257786D1EFACAA60057DACB /* LoginViewController.swift in Sources */, + 82A3D5A11F000B42009BFB2E /* Keys.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -544,7 +604,7 @@ DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = BaseMVC/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = thl.mvc.vn; + PRODUCT_BUNDLE_IDENTIFIER = vn.thl.mvc; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 3.0; @@ -559,7 +619,7 @@ DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = BaseMVC/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = thl.mvc.vn; + PRODUCT_BUNDLE_IDENTIFIER = vn.thl.mvc; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 3.0; diff --git a/BaseMVC/Sources/Controllers/BaseViewController.swift b/BaseMVC/Sources/Controllers/BaseViewController.swift index 8c17156..7927f7f 100644 --- a/BaseMVC/Sources/Controllers/BaseViewController.swift +++ b/BaseMVC/Sources/Controllers/BaseViewController.swift @@ -5,6 +5,13 @@ class BaseViewController: UIViewController, UIGestureRecognizerDelegate { // MARK: - IBOutlet // MARK: - Varialbes + lazy var mainTabBarViewController: MainTabBarController? = { + if let _tabBarController = self.tabBarController as? MainTabBarController { + return _tabBarController + } + + return self.view.window?.rootViewController as? MainTabBarController + }() // MARK: - View Lifecycle override func viewDidLoad() { diff --git a/BaseMVC/Sources/Controllers/LoginViewController.swift b/BaseMVC/Sources/Controllers/LoginViewController.swift new file mode 100644 index 0000000..0c1f8f5 --- /dev/null +++ b/BaseMVC/Sources/Controllers/LoginViewController.swift @@ -0,0 +1,72 @@ +// +// LoginViewController.swift +// BaseMVC +// +// Created by Henry Tran on 6/21/17. +// Copyright © 2017 THL. All rights reserved. +// + +import UIKit + +class LoginViewController: BaseViewController { + + // MARK: - IBOutlet + + // MARK: - Varialbes + + // MARK: - View Lifecycle + override func viewDidLoad() { + super.viewDidLoad() + self.addBtnRightNavWithTitle(title: "Setting") + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + // MARK: - Navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + + // MARK: - Setup View + + // MARK: - Call Api + + // MARK: - Actions + @IBAction func actionTouchBtnLogin(_ sender: Any) { + self.mainTabBarViewController?.setupMainApp() + self.dismiss(animated: true, completion: nil) + } + + override func actionTouchBtnRight() { + let userSettingVC = LoginViewController.getViewControllerFromStoryboard(Storyboard.User.name) + let navigationVC = UINavigationController(rootViewController: userSettingVC) + + // create animator for present + // let animator = Animator(presentedType: .push, dismissedType: .push) + // self.menuViewController?.animator = animator + // + // navigationVC.transitioningDelegate = self.menuViewController + + // present + self.present(navigationVC, animated: true, completion: nil) + } + + // MARK: - Functions + +} diff --git a/BaseMVC/Sources/Controllers/MainTabBarController.swift b/BaseMVC/Sources/Controllers/MainTabBarController.swift new file mode 100644 index 0000000..5ee18f1 --- /dev/null +++ b/BaseMVC/Sources/Controllers/MainTabBarController.swift @@ -0,0 +1,95 @@ +import UIKit + +enum TabBarType: String { + case timeline + case message + case more +} + +class MainTabBarController: UITabBarController { + + // MARK: - Varialbes + + // MARK: - View Lifecycle + override func awakeFromNib() { + super.awakeFromNib() + + // setup + self.setupStartApp() + } + + override func viewDidLoad() { + super.viewDidLoad() + + // self.view.alpha = 0.0 + // setup view + self.setupView() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + // animate when appear + UIView.animate(withDuration: 0.5) { + self.view.alpha = 1.0 + } + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + // MARK: - Setup View + private func setupView() { + + } + + func hideTabbar(hide: Bool?, animated: Bool = false) { + self.tabBar.isHidden = hide ?? false + } + + // MARK: - Actions + + // MARK: - Call Api + + // MARK: - Functions + private func setupStartApp() { + let startViewController = StartViewController.getViewControllerFromStoryboard(Storyboard.Main.name) + // set list childs controller to tabbar + let controllers = [startViewController] + self.viewControllers = controllers + self.hideTabbar(hide: true) + } + + func setupMainApp() { + + // Timeline + let navigationTimeline = UIStoryboard(name: Storyboard.Timeline.name, bundle: nil).instantiateInitialViewController()! + let tabBarItemTimeline = UITabBarItem(tabBarSystemItem: .contacts, tag: 10) + navigationTimeline.tabBarItem = tabBarItemTimeline + + // Message + let navigationMessage = UIStoryboard(name: Storyboard.Message.name, bundle: nil).instantiateInitialViewController()! + let tabBarItemMessage = UITabBarItem(tabBarSystemItem: .bookmarks, tag: 20) + navigationMessage.tabBarItem = tabBarItemMessage + + // User + let navigationUser = UIStoryboard(name: Storyboard.User.name, bundle: nil).instantiateInitialViewController()! + let tabBarItemUser = UITabBarItem(tabBarSystemItem: .more, tag: 30) + navigationUser.tabBarItem = tabBarItemUser + + // set list childs controller to tabbar + let controllers = [navigationTimeline, navigationMessage, navigationUser] + self.viewControllers = controllers + self.hideTabbar(hide: false) + } +} diff --git a/BaseMVC/Sources/Controllers/StartViewController.swift b/BaseMVC/Sources/Controllers/StartViewController.swift index 9a2d3c5..83112c2 100644 --- a/BaseMVC/Sources/Controllers/StartViewController.swift +++ b/BaseMVC/Sources/Controllers/StartViewController.swift @@ -4,8 +4,6 @@ class StartViewController: BaseViewController { // MARK: - IBOutlet - @IBOutlet weak var tableView: UITableView! - // MARK: - Varialbes // MARK: - View Lifecycle @@ -47,9 +45,29 @@ class StartViewController: BaseViewController { // MARK: - Functions private func checkApp() { + + // User module (login, register, ...) + self.perform(#selector(StartViewController.gotoUser), with: nil, afterDelay: 1) + + // Main app + // self.perform(#selector(StartViewController.gotoMainApp), with: nil, afterDelay: 1) } - func gotoMainApp() { + func gotoUser() { + let userSettingVC = LoginViewController.getViewControllerFromStoryboard(Storyboard.User.name) + let navigationVC = UINavigationController(rootViewController: userSettingVC) + // create animator for present + // let animator = Animator(presentedType: .push, dismissedType: .push) + // self.menuViewController?.animator = animator + // + // navigationVC.transitioningDelegate = self.menuViewController + + // present + self.present(navigationVC, animated: true, completion: nil) + } + + func gotoMainApp() { + self.mainTabBarViewController?.setupMainApp() } } diff --git a/BaseMVC/Sources/Dao/UserDao.swift b/BaseMVC/Sources/Dao/UserDao.swift new file mode 100644 index 0000000..b7c019b --- /dev/null +++ b/BaseMVC/Sources/Dao/UserDao.swift @@ -0,0 +1,13 @@ +// +// UserDao.swift +// Project +// +// Created by Henry Tran on 6/24/17. +// Copyright © 2017 THL. All rights reserved. +// + +import RealmSwift + +struct UserDao { + +} diff --git a/BaseMVC/Sources/Helpers/Config.swift b/BaseMVC/Sources/Helpers/Config.swift deleted file mode 100644 index dd9117b..0000000 --- a/BaseMVC/Sources/Helpers/Config.swift +++ /dev/null @@ -1,6 +0,0 @@ -let baseUrl = "https://dev.mvc.vn" -let clientId = "MVC" -let clientSecrect = "secret" -let dataVersion = 1 -let appId = "12345678" -let platform = "iOS" diff --git a/BaseMVC/Sources/Helpers/Define/Config.swift b/BaseMVC/Sources/Helpers/Define/Config.swift new file mode 100644 index 0000000..1d59a8b --- /dev/null +++ b/BaseMVC/Sources/Helpers/Define/Config.swift @@ -0,0 +1,8 @@ +struct Config { + static let baseUrl = "https://dev.mvc.vn" + static let clientId = "MVC" + static let clientSecrect = "secret" + static let dataVersion = 1 + static let appId = "12345678" + static let platform = "iOS" +} diff --git a/BaseMVC/Sources/Helpers/Constants.swift b/BaseMVC/Sources/Helpers/Define/Constants.swift similarity index 100% rename from BaseMVC/Sources/Helpers/Constants.swift rename to BaseMVC/Sources/Helpers/Define/Constants.swift diff --git a/BaseMVC/Sources/Helpers/Define/EnumDefine.swift b/BaseMVC/Sources/Helpers/Define/EnumDefine.swift new file mode 100644 index 0000000..f4f1c53 --- /dev/null +++ b/BaseMVC/Sources/Helpers/Define/EnumDefine.swift @@ -0,0 +1,9 @@ +// +enum DateFormat: String { + case yyyyssDash = "yyyy-MM-dd'T'HH:mm:ss" + case ddmmSlash = "dd/MM/yyyy HH:mm" + case ddMMyyyy = "dd/MM/yyyy" + case yyyyMMddDash = "yyyy-MM-dd" + case MMyyyy = "MM/yyyy" + case yyyyssSSSZZZZZ = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ" +} diff --git a/BaseMVC/Sources/Helpers/Func.swift b/BaseMVC/Sources/Helpers/Define/Func.swift similarity index 100% rename from BaseMVC/Sources/Helpers/Func.swift rename to BaseMVC/Sources/Helpers/Define/Func.swift diff --git a/BaseMVC/Sources/Helpers/Keys.swift b/BaseMVC/Sources/Helpers/Define/Keys.swift similarity index 100% rename from BaseMVC/Sources/Helpers/Keys.swift rename to BaseMVC/Sources/Helpers/Define/Keys.swift diff --git a/BaseMVC/Sources/Helpers/LocalizableString.swift b/BaseMVC/Sources/Helpers/Define/LocalizableString.swift similarity index 100% rename from BaseMVC/Sources/Helpers/LocalizableString.swift rename to BaseMVC/Sources/Helpers/Define/LocalizableString.swift diff --git a/BaseMVC/Sources/Helpers/Define/StructDefine.swift b/BaseMVC/Sources/Helpers/Define/StructDefine.swift new file mode 100644 index 0000000..37de763 --- /dev/null +++ b/BaseMVC/Sources/Helpers/Define/StructDefine.swift @@ -0,0 +1,9 @@ +public struct GroupItem { + public var group: Group + public var items: [Item] + + public init(group: Group, items: [Item]) { + self.group = group + self.items = items + } +} diff --git a/BaseMVC/Sources/Helpers/ViewDefine.swift b/BaseMVC/Sources/Helpers/Define/ViewDefine.swift similarity index 53% rename from BaseMVC/Sources/Helpers/ViewDefine.swift rename to BaseMVC/Sources/Helpers/Define/ViewDefine.swift index 863aac6..b3bab5b 100644 --- a/BaseMVC/Sources/Helpers/ViewDefine.swift +++ b/BaseMVC/Sources/Helpers/Define/ViewDefine.swift @@ -5,6 +5,19 @@ struct Storyboard { static let name = "Main" static let startViewController = "StartViewController" } + + struct User { + static let name = "User" + static let loginViewController = "LoginViewController" + } + + struct Timeline { + static let name = "Timeline" + } + + struct Message { + static let name = "Message" + } } struct ReuseView { diff --git a/BaseMVC/Sources/Helpers/EnumDefine.swift b/BaseMVC/Sources/Helpers/EnumDefine.swift deleted file mode 100644 index 8337712..0000000 --- a/BaseMVC/Sources/Helpers/EnumDefine.swift +++ /dev/null @@ -1 +0,0 @@ -// diff --git a/BaseMVC/Sources/Extensions/Color+Ext.swift b/BaseMVC/Sources/Helpers/Extensions/Color+Ext.swift similarity index 100% rename from BaseMVC/Sources/Extensions/Color+Ext.swift rename to BaseMVC/Sources/Helpers/Extensions/Color+Ext.swift diff --git a/BaseMVC/Sources/Extensions/Date+Ext.swift b/BaseMVC/Sources/Helpers/Extensions/Date+Ext.swift similarity index 81% rename from BaseMVC/Sources/Extensions/Date+Ext.swift rename to BaseMVC/Sources/Helpers/Extensions/Date+Ext.swift index eaf99b7..410f9aa 100644 --- a/BaseMVC/Sources/Extensions/Date+Ext.swift +++ b/BaseMVC/Sources/Helpers/Extensions/Date+Ext.swift @@ -15,40 +15,40 @@ import Foundation extension Date { // MARK: - Date - static func convertDateToString(fromDate: Date?, format: String) -> String? { + static func convertDateToString(fromDate: Date?, format: DateFormat) -> String? { if let convertDate = fromDate { let dateFormatter = DateFormatter() dateFormatter.timeZone = NSTimeZone.default dateFormatter.locale = NSLocale(localeIdentifier: Constant.defaultDateLocale) as Locale! - dateFormatter.dateFormat = format + dateFormatter.dateFormat = format.rawValue return dateFormatter.string(from: convertDate) } else { return nil } } - static func convertStringToDate(fromString: String?, format: String) -> Date? { + static func convertStringToDate(fromString: String?, format: DateFormat) -> Date? { if let dateString = fromString { let dateFormatter = DateFormatter() dateFormatter.timeZone = NSTimeZone.default dateFormatter.locale = NSLocale(localeIdentifier: Constant.defaultDateLocale) as Locale! - dateFormatter.dateFormat = format + dateFormatter.dateFormat = format.rawValue return dateFormatter.date(from: dateString) } else { return nil } } - static func convertStringDateToString(fromString: String?, fromFormat: String, toFormat: String) -> String? { + static func convertStringDateToString(fromString: String?, fromFormat: DateFormat, toFormat: DateFormat) -> String? { if let dateString = fromString { let dateFormatter = DateFormatter() dateFormatter.timeZone = NSTimeZone.default dateFormatter.locale = NSLocale(localeIdentifier: Constant.defaultDateLocale) as Locale! - dateFormatter.dateFormat = fromFormat + dateFormatter.dateFormat = fromFormat.rawValue guard let date = dateFormatter.date(from: dateString) else { return nil } - dateFormatter.dateFormat = toFormat + dateFormatter.dateFormat = toFormat.rawValue return dateFormatter.string(from: date) } else { return nil diff --git a/BaseMVC/Sources/Extensions/String+Ext.swift b/BaseMVC/Sources/Helpers/Extensions/String+Ext.swift similarity index 100% rename from BaseMVC/Sources/Extensions/String+Ext.swift rename to BaseMVC/Sources/Helpers/Extensions/String+Ext.swift diff --git a/BaseMVC/Sources/Extensions/UITableView+Ext.swift b/BaseMVC/Sources/Helpers/Extensions/UITableView+Ext.swift similarity index 100% rename from BaseMVC/Sources/Extensions/UITableView+Ext.swift rename to BaseMVC/Sources/Helpers/Extensions/UITableView+Ext.swift diff --git a/BaseMVC/Sources/Extensions/UIView+Ext.swift b/BaseMVC/Sources/Helpers/Extensions/UIView+Ext.swift similarity index 100% rename from BaseMVC/Sources/Extensions/UIView+Ext.swift rename to BaseMVC/Sources/Helpers/Extensions/UIView+Ext.swift diff --git a/BaseMVC/Sources/Extensions/UIViewController+Ext.swift b/BaseMVC/Sources/Helpers/Extensions/UIViewController+Ext.swift similarity index 100% rename from BaseMVC/Sources/Extensions/UIViewController+Ext.swift rename to BaseMVC/Sources/Helpers/Extensions/UIViewController+Ext.swift diff --git a/BaseMVC/Sources/Helpers/Managers/LocationManager.swift b/BaseMVC/Sources/Helpers/Managers/LocationManager.swift new file mode 100644 index 0000000..3b4d200 --- /dev/null +++ b/BaseMVC/Sources/Helpers/Managers/LocationManager.swift @@ -0,0 +1,172 @@ +import UIKit +import CoreLocation + +// MARK: - Notification +enum LocationEvent { + static let didLocationDenied = "didLocationDeniedNotification" +} + +class LocationManager: NSObject { + + // MARK: - Varialbes + fileprivate var locationManager: CLLocationManager? + fileprivate var getCurrentLocationCallback: ((CLLocation?) -> Void)? + var currentLocation: CLLocation? + var accuracy: Double = 0.5 + + // MARK: - Singleton + static let shared = LocationManager() + + // MARK: - Init + override init() { + super.init() + } + + func startLocationServices() { + self.locationManager = CLLocationManager() + self.locationManager?.delegate = self + } + + // MARK: - Callback + func getCurrentLocation(completion: ((_ location: CLLocation?) -> Void)?) { + self.getCurrentLocationCallback = completion + self.startStandardUpdates() + } + + func stopGetCurrentLocation() { + self.getCurrentLocationCallback = nil + self.locationManager?.stopUpdatingLocation() + } + + // MARK: - Updating Location + func startStandardUpdates() { + if CLLocationManager.locationServicesEnabled() && + CLLocationManager.authorizationStatus() != .denied { + self.locationManager?.pausesLocationUpdatesAutomatically = true + self.locationManager?.desiredAccuracy = kCLLocationAccuracyBest + self.locationManager?.activityType = CLActivityType.otherNavigation + self.locationManager?.distanceFilter = 10.0 + self.locationManager?.startUpdatingLocation() + } else { + self.startLocationServices() + } + } + + func stopStandardUpdates() { + self.locationManager?.stopUpdatingLocation() + } + + func startSignificantChangeUpdates() { + if CLLocationManager.significantLocationChangeMonitoringAvailable() { + self.locationManager?.pausesLocationUpdatesAutomatically = true + self.locationManager?.activityType = CLActivityType.otherNavigation + self.locationManager?.startMonitoringSignificantLocationChanges() + } + } + + func stopMonitoringSignificantLocationChanges () { + if CLLocationManager.significantLocationChangeMonitoringAvailable() { + self.locationManager?.stopMonitoringSignificantLocationChanges() + } + } + + // MARK: - Monitoring Regions + func startMonitoringForRegionBeacon() { + } + + func requestStateForRegionBeacon() { + guard let locManager = self.locationManager else {return} + + for region: CLRegion in locManager.monitoredRegions where region is CLBeaconRegion { + locManager.requestState(for: region) + } + } + + func stopMonitoringForRegionBeacon() { + guard let locManager = self.locationManager else {return} + + for region: CLRegion in locManager.monitoredRegions { + if let beaconRegion = region as? CLBeaconRegion { + locManager.stopRangingBeacons(in: beaconRegion) + locManager.stopMonitoring(for: beaconRegion) + } + } + } + + func startMonitoringForRegionCircular() { + } + + func requestStateForRegionCircular() { + guard let locManager = self.locationManager else {return} + + for region: CLRegion in locManager.monitoredRegions where region is CLCircularRegion { + locManager.requestState(for: region) + } + } + + func stopMonitoringForRegionCircular() { + guard let locManager = self.locationManager else {return} + + for region: CLRegion in locManager.monitoredRegions where region is CLCircularRegion { + locManager.stopMonitoring(for: region) + } + } + + func stopMonitoringAll() { + self.stopMonitoringForRegionCircular() + self.stopMonitoringForRegionBeacon() + self.stopStandardUpdates() + } + +} + +extension LocationManager: CLLocationManagerDelegate { + + func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { + + // check status + switch status { + case .notDetermined: + manager.requestAlwaysAuthorization() + break + case .restricted: + break + case .denied: + LocationManager.shared.stopGetCurrentLocation() + + // post notification + NotificationCenter.default.post(name: Notification.Name(LocationEvent.didLocationDenied), object: nil, userInfo: nil) + case .authorizedAlways: + LocationManager.shared.getCurrentLocation(completion: { _ in + LocationManager.shared.stopGetCurrentLocation() + }) + case .authorizedWhenInUse: + LocationManager.shared.getCurrentLocation(completion: { _ in + LocationManager.shared.stopGetCurrentLocation() + }) + } + } + + func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + + // get location + if let latestLocation = locations.last { + let howRecent = latestLocation.timestamp.timeIntervalSinceNow + + if abs(howRecent) <= accuracy { + self.currentLocation = latestLocation + self.getCurrentLocationCallback?(latestLocation) + self.stopStandardUpdates() + } else { + self.startStandardUpdates() + } + } else { + self.startStandardUpdates() + } + } + + func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { + self.getCurrentLocationCallback?(nil) + } + +} diff --git a/BaseMVC/Sources/Manager/RealmManager.swift b/BaseMVC/Sources/Helpers/Managers/RealmManager.swift similarity index 90% rename from BaseMVC/Sources/Manager/RealmManager.swift rename to BaseMVC/Sources/Helpers/Managers/RealmManager.swift index 7e1d1cc..e9c44c6 100644 --- a/BaseMVC/Sources/Manager/RealmManager.swift +++ b/BaseMVC/Sources/Helpers/Managers/RealmManager.swift @@ -7,7 +7,7 @@ struct RealmManager { logD("\(String(describing: fileURL))") // get schema version - let schemaVersion = UInt64(dataVersion) + let schemaVersion = UInt64(Config.dataVersion) // create config let config = Realm.Configuration( diff --git a/BaseMVC/Sources/Manager/Animator.swift b/BaseMVC/Sources/Helpers/Managers/TransitionManager.swift similarity index 88% rename from BaseMVC/Sources/Manager/Animator.swift rename to BaseMVC/Sources/Helpers/Managers/TransitionManager.swift index 0fe653f..f98d74d 100644 --- a/BaseMVC/Sources/Manager/Animator.swift +++ b/BaseMVC/Sources/Helpers/Managers/TransitionManager.swift @@ -1,18 +1,17 @@ import UIKit -public enum AnimationType { - case push - case pop - case present - case dismiss +public enum TransitionStyle { + case leftToRight + case rightToLeft + case fade case none } -class Animator: NSObject, UIViewControllerAnimatedTransitioning { +class TransitionManager: NSObject, UIViewControllerAnimatedTransitioning { - var presentedType: AnimationType = .push - var dismissedType: AnimationType = .pop - var animateType: AnimationType = .none + var presentedType: TransitionStyle = .rightToLeft + var dismissedType: TransitionStyle = .leftToRight + var animateType: TransitionStyle = .none var transitionDuration: TimeInterval = 0.33 // MARK: Init @@ -20,7 +19,7 @@ class Animator: NSObject, UIViewControllerAnimatedTransitioning { } - init(presentedType: AnimationType, dismissedType: AnimationType) { + init(presentedType: TransitionStyle, dismissedType: TransitionStyle) { self.presentedType = presentedType self.dismissedType = dismissedType } @@ -30,10 +29,11 @@ class Animator: NSObject, UIViewControllerAnimatedTransitioning { } func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { + switch animateType { - case .push: + case .rightToLeft: self.pushAnimation(transitionContext) - case .pop: + case .leftToRight: self.popAnimation(transitionContext) default: self.pushAnimation(transitionContext) diff --git a/BaseMVC/Sources/Helpers/StructDefine.swift b/BaseMVC/Sources/Helpers/StructDefine.swift deleted file mode 100644 index f09bcc1..0000000 --- a/BaseMVC/Sources/Helpers/StructDefine.swift +++ /dev/null @@ -1,17 +0,0 @@ -struct DateFormat { - static let yyyyssDash = "yyyy-MM-dd'T'HH:mm:ss" - static let ddmmSlash = "dd/MM/yyyy HH:mm" - static let ddMMyyyy = "dd/MM/yyyy" - static let yyyyMMddDash = "yyyy-MM-dd" - static let MMyyyy = "MM/yyyy" -} - -public struct GroupItem { - public var group: Group - public var items: [Item] - - public init(group: Group, items: [Item]) { - self.group = group - self.items = items - } -} diff --git a/BaseMVC/Sources/Services/ApiClient.swift b/BaseMVC/Sources/Services/ApiClient.swift index c120776..d314dda 100644 --- a/BaseMVC/Sources/Services/ApiClient.swift +++ b/BaseMVC/Sources/Services/ApiClient.swift @@ -17,17 +17,22 @@ struct HeaderValue { enum RequestResult { case success case error - // case timeOut - // case notConnectedToInternet case cancelled } public enum HttpStatusCode: Int { case ok = 200 + case created = 201 + case accepted = 202 + case noContent = 204 case badRequest = 400 case unauthorized = 401 + case forbidden = 403 case notFound = 404 + case notAcceptable = 406 + case requestTimeout = 408 case conflict = 409 + case internalServerError = 500 case serviceUnavailable = 503 case notConnectedToInternet = -1009 case cancelled = -999 @@ -67,7 +72,7 @@ struct ApiClient { let sessionManager = SessionManager(configuration: configuration) // OAuthHandler - let oAuthHandler = OAuthHandler(baseUrl: baseUrl) + let oAuthHandler = OAuthHandler(baseUrl: Config.baseUrl) sessionManager.adapter = oAuthHandler sessionManager.retrier = oAuthHandler diff --git a/BaseMVC/Sources/Services/AppRouter.swift b/BaseMVC/Sources/Services/AppRouter.swift index ec31910..b203377 100644 --- a/BaseMVC/Sources/Services/AppRouter.swift +++ b/BaseMVC/Sources/Services/AppRouter.swift @@ -18,7 +18,7 @@ enum AppRouter: URLRequestConvertible { } // MARK: URLRequestConvertible func asURLRequest() throws -> URLRequest { - let url = try baseUrl.asURL() + let url = try Config.baseUrl.asURL() var urlRequest = URLRequest(url: url.appendingPathComponent(path)) urlRequest.httpMethod = method.rawValue diff --git a/BaseMVC/Sources/Views/Base.lproj/Main.storyboard b/BaseMVC/Sources/Views/Base.lproj/Main.storyboard index 3645a2b..9c927f2 100644 --- a/BaseMVC/Sources/Views/Base.lproj/Main.storyboard +++ b/BaseMVC/Sources/Views/Base.lproj/Main.storyboard @@ -1,5 +1,5 @@ - + @@ -9,6 +9,20 @@ + + + + + + + + + + + + + + @@ -43,7 +57,7 @@ - + diff --git a/BaseMVC/Sources/Views/Message.storyboard b/BaseMVC/Sources/Views/Message.storyboard new file mode 100644 index 0000000..5c2058e --- /dev/null +++ b/BaseMVC/Sources/Views/Message.storyboard @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BaseMVC/Sources/Views/Timeline.storyboard b/BaseMVC/Sources/Views/Timeline.storyboard new file mode 100644 index 0000000..a54cee2 --- /dev/null +++ b/BaseMVC/Sources/Views/Timeline.storyboard @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BaseMVC/Sources/Views/User.storyboard b/BaseMVC/Sources/Views/User.storyboard new file mode 100644 index 0000000..06b4762 --- /dev/null +++ b/BaseMVC/Sources/Views/User.storyboard @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Podfile b/Podfile index ead1708..0a4f817 100644 --- a/Podfile +++ b/Podfile @@ -9,5 +9,4 @@ target 'BaseMVC' do pod 'Alamofire', '~> 4.4' pod 'SwiftyJSON' pod 'RealmSwift' - end diff --git a/Podfile.lock b/Podfile.lock index 61f53e4..aa93b7e 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -18,6 +18,6 @@ SPEC CHECKSUMS: RealmSwift: 4764ca7657f2193c256fb032c0b123926f70dbcd SwiftyJSON: c2842d878f95482ffceec5709abc3d05680c0220 -PODFILE CHECKSUM: 85c5158b9d1f2572801568da02b6a23bbed20411 +PODFILE CHECKSUM: c96156d331df90a14bae75c7e7487d003fd3e32c COCOAPODS: 1.2.1