From b751f233f0896291c386f8381eff8941db15020b Mon Sep 17 00:00:00 2001 From: Yutaro Muta Date: Thu, 7 Sep 2017 00:43:15 +0900 Subject: [PATCH 1/4] Add SurveyURLAPIRequest --- PyConJP.xcodeproj/project.pbxproj | 60 ++++- .../{ => GitHub}/StaffListAPIRequest.swift | 0 .../GitHub/SurveyURLAPIRequest.swift | 32 +++ .../{ => PyConJP}/TalkDetailAPIRequest.swift | 0 .../{ => PyConJP}/TalksAPIRequest.swift | 0 .../Localizable/Base.lproj/MoreList.strings | 28 +++ .../Localizable/en.lproj/MoreList.strings | 28 +++ .../Localizable/ja.lproj/MoreList.strings | 28 +++ PyConJP/Storyboard/Base.lproj/More.storyboard | 223 ++---------------- PyConJP/Storyboard/en.lproj/More.strings | 48 ---- PyConJP/Storyboard/ja.lproj/More.strings | 48 ---- .../Events/EventsListViewController.swift | 4 +- .../More/MoreListViewController.swift | 98 ++++++-- 13 files changed, 271 insertions(+), 326 deletions(-) rename PyConJP/Model/APIRequest/{ => GitHub}/StaffListAPIRequest.swift (100%) create mode 100644 PyConJP/Model/APIRequest/GitHub/SurveyURLAPIRequest.swift rename PyConJP/Model/APIRequest/{ => PyConJP}/TalkDetailAPIRequest.swift (100%) rename PyConJP/Model/APIRequest/{ => PyConJP}/TalksAPIRequest.swift (100%) create mode 100644 PyConJP/Resource/Localizable/Base.lproj/MoreList.strings create mode 100644 PyConJP/Resource/Localizable/en.lproj/MoreList.strings create mode 100644 PyConJP/Resource/Localizable/ja.lproj/MoreList.strings diff --git a/PyConJP.xcodeproj/project.pbxproj b/PyConJP.xcodeproj/project.pbxproj index c38af7e..f87f1fe 100644 --- a/PyConJP.xcodeproj/project.pbxproj +++ b/PyConJP.xcodeproj/project.pbxproj @@ -85,6 +85,11 @@ DB10DEA11EDFDF8200DAED31 /* NibInstantitable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB10DEA01EDFDF8200DAED31 /* NibInstantitable.swift */; }; DB10DEA31EDFDF9900DAED31 /* StoryboardIdentifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB10DEA21EDFDF9900DAED31 /* StoryboardIdentifiable.swift */; }; DB10DEA71EDFE62A00DAED31 /* RealmError.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB10DEA61EDFE62A00DAED31 /* RealmError.swift */; }; + DB1140B51F5EAC8F0046442E /* StaffListAPIRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1140B11F5EAC8F0046442E /* StaffListAPIRequest.swift */; }; + DB1140B61F5EAC8F0046442E /* TalkDetailAPIRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1140B31F5EAC8F0046442E /* TalkDetailAPIRequest.swift */; }; + DB1140B71F5EAC8F0046442E /* TalksAPIRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1140B41F5EAC8F0046442E /* TalksAPIRequest.swift */; }; + DB1140B91F5EACDE0046442E /* SurveyURLAPIRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1140B81F5EACDE0046442E /* SurveyURLAPIRequest.swift */; }; + DB1140BC1F604A860046442E /* MoreList.strings in Resources */ = {isa = PBXBuildFile; fileRef = DB1140BE1F604A860046442E /* MoreList.strings */; }; DB28C1921F59AFB2003BEFE0 /* GitHubRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB28C1911F59AFB2003BEFE0 /* GitHubRequest.swift */; }; DB4BC68F1EF5098D00650964 /* SpreadsheetView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB4BC68E1EF5098D00650964 /* SpreadsheetView.framework */; }; DB4BC6911EF522CD00650964 /* ConferenceTimetableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4BC6901EF522CD00650964 /* ConferenceTimetableViewController.swift */; }; @@ -116,9 +121,6 @@ DBA8722F1EF1A40E0001F8A3 /* LocalNotificationProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA8722D1EF1A40E0001F8A3 /* LocalNotificationProtocol.swift */; }; DBA872301EF1A40E0001F8A3 /* ReceiveLocalNotificationProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA8722E1EF1A40E0001F8A3 /* ReceiveLocalNotificationProtocol.swift */; }; DBA872321EF1A4990001F8A3 /* NotificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA872311EF1A4990001F8A3 /* NotificationType.swift */; }; - DBA872371EF2E0E90001F8A3 /* StaffListAPIRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA872341EF2E0E90001F8A3 /* StaffListAPIRequest.swift */; }; - DBA872381EF2E0E90001F8A3 /* TalkDetailAPIRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA872351EF2E0E90001F8A3 /* TalkDetailAPIRequest.swift */; }; - DBA872391EF2E0E90001F8A3 /* TalksAPIRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA872361EF2E0E90001F8A3 /* TalksAPIRequest.swift */; }; DBA8723C1EF2E14B0001F8A3 /* SaveTalksRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA8723B1EF2E14B0001F8A3 /* SaveTalksRequest.swift */; }; DBA8723E1EF2E5320001F8A3 /* LoadFavoriteTalksRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA8723D1EF2E5320001F8A3 /* LoadFavoriteTalksRequest.swift */; }; DBA872401EF2E7410001F8A3 /* LoadTalksRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA8723F1EF2E7410001F8A3 /* LoadTalksRequest.swift */; }; @@ -271,6 +273,13 @@ DB10DEA01EDFDF8200DAED31 /* NibInstantitable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NibInstantitable.swift; sourceTree = ""; }; DB10DEA21EDFDF9900DAED31 /* StoryboardIdentifiable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoryboardIdentifiable.swift; sourceTree = ""; }; DB10DEA61EDFE62A00DAED31 /* RealmError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RealmError.swift; sourceTree = ""; }; + DB1140B11F5EAC8F0046442E /* StaffListAPIRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StaffListAPIRequest.swift; sourceTree = ""; }; + DB1140B31F5EAC8F0046442E /* TalkDetailAPIRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TalkDetailAPIRequest.swift; sourceTree = ""; }; + DB1140B41F5EAC8F0046442E /* TalksAPIRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TalksAPIRequest.swift; sourceTree = ""; }; + DB1140B81F5EACDE0046442E /* SurveyURLAPIRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SurveyURLAPIRequest.swift; sourceTree = ""; }; + DB1140BD1F604A860046442E /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/MoreList.strings; sourceTree = ""; }; + DB1140BF1F604C620046442E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/MoreList.strings; sourceTree = ""; }; + DB1140C01F604C630046442E /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/MoreList.strings; sourceTree = ""; }; DB28C1911F59AFB2003BEFE0 /* GitHubRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubRequest.swift; sourceTree = ""; }; DB4BC68E1EF5098D00650964 /* SpreadsheetView.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SpreadsheetView.framework; path = Carthage/Build/iOS/SpreadsheetView.framework; sourceTree = ""; }; DB4BC6901EF522CD00650964 /* ConferenceTimetableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceTimetableViewController.swift; sourceTree = ""; }; @@ -320,9 +329,6 @@ DBA8722D1EF1A40E0001F8A3 /* LocalNotificationProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalNotificationProtocol.swift; sourceTree = ""; }; DBA8722E1EF1A40E0001F8A3 /* ReceiveLocalNotificationProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReceiveLocalNotificationProtocol.swift; sourceTree = ""; }; DBA872311EF1A4990001F8A3 /* NotificationType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationType.swift; sourceTree = ""; }; - DBA872341EF2E0E90001F8A3 /* StaffListAPIRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StaffListAPIRequest.swift; sourceTree = ""; }; - DBA872351EF2E0E90001F8A3 /* TalkDetailAPIRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TalkDetailAPIRequest.swift; sourceTree = ""; }; - DBA872361EF2E0E90001F8A3 /* TalksAPIRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TalksAPIRequest.swift; sourceTree = ""; }; DBA8723B1EF2E14B0001F8A3 /* SaveTalksRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SaveTalksRequest.swift; sourceTree = ""; }; DBA8723D1EF2E5320001F8A3 /* LoadFavoriteTalksRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadFavoriteTalksRequest.swift; sourceTree = ""; }; DBA8723F1EF2E7410001F8A3 /* LoadTalksRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadTalksRequest.swift; sourceTree = ""; }; @@ -552,6 +558,7 @@ DB05D1451E43FBCB00781BF7 /* Map.strings */, DB05D1471E43FBCB00781BF7 /* URLScheme.strings */, DB51C21B1F5322D20016C952 /* EventList.strings */, + DB1140BE1F604A860046442E /* MoreList.strings */, ); path = Localizable; sourceTree = ""; @@ -718,6 +725,24 @@ path = UI; sourceTree = ""; }; + DB1140B01F5EAC8F0046442E /* GitHub */ = { + isa = PBXGroup; + children = ( + DB1140B11F5EAC8F0046442E /* StaffListAPIRequest.swift */, + DB1140B81F5EACDE0046442E /* SurveyURLAPIRequest.swift */, + ); + path = GitHub; + sourceTree = ""; + }; + DB1140B21F5EAC8F0046442E /* PyConJP */ = { + isa = PBXGroup; + children = ( + DB1140B31F5EAC8F0046442E /* TalkDetailAPIRequest.swift */, + DB1140B41F5EAC8F0046442E /* TalksAPIRequest.swift */, + ); + path = PyConJP; + sourceTree = ""; + }; DB4BC6921EF5257200650964 /* SpreadsheetViewCell */ = { isa = PBXGroup; children = ( @@ -868,9 +893,8 @@ DBA872331EF2E0E90001F8A3 /* APIRequest */ = { isa = PBXGroup; children = ( - DBA872341EF2E0E90001F8A3 /* StaffListAPIRequest.swift */, - DBA872351EF2E0E90001F8A3 /* TalkDetailAPIRequest.swift */, - DBA872361EF2E0E90001F8A3 /* TalksAPIRequest.swift */, + DB1140B21F5EAC8F0046442E /* PyConJP */, + DB1140B01F5EAC8F0046442E /* GitHub */, ); path = APIRequest; sourceTree = ""; @@ -1109,6 +1133,7 @@ DB05D1C11E43FBCB00781BF7 /* DummyTalks.json in Resources */, DB05D1CA1E43FBCB00781BF7 /* Main.storyboard in Resources */, DB05D1D51E43FBCB00781BF7 /* SpeakerCollectionViewCell.xib in Resources */, + DB1140BC1F604A860046442E /* MoreList.strings in Resources */, DB05D1C41E43FBCB00781BF7 /* Map.strings in Resources */, DB05D1C81E43FBCB00781BF7 /* Events.storyboard in Resources */, DB05D1C01E43FBCB00781BF7 /* DummyTalkDetail.json in Resources */, @@ -1211,6 +1236,7 @@ DB7EAAE21EF04DAC00FEF504 /* DummyTalksProtocol.swift in Sources */, DB4BC6A81EF5926600650964 /* ConferenceTimetableDataStore.swift in Sources */, DB4BC6A51EF5916D00650964 /* TimelineDataSource.swift in Sources */, + DB1140B91F5EACDE0046442E /* SurveyURLAPIRequest.swift in Sources */, DB05D1E51E43FBCB00781BF7 /* EventsListViewController.swift in Sources */, DBA872301EF1A40E0001F8A3 /* ReceiveLocalNotificationProtocol.swift in Sources */, DB05D1E01E43FBCB00781BF7 /* ConferenceDateViewController.swift in Sources */, @@ -1224,15 +1250,12 @@ DB05D1A41E43FBCB00781BF7 /* UIColorExtension.swift in Sources */, DB05D1971E43FBCB00781BF7 /* AppDelegate.swift in Sources */, DBA872401EF2E7410001F8A3 /* LoadTalksRequest.swift in Sources */, - DBA872391EF2E0E90001F8A3 /* TalksAPIRequest.swift in Sources */, - DBA872381EF2E0E90001F8A3 /* TalkDetailAPIRequest.swift in Sources */, DB10DEA11EDFDF8200DAED31 /* NibInstantitable.swift in Sources */, DB05D1BC1E43FBCB00781BF7 /* TwitterURLSchemeProtocol.swift in Sources */, DB05D1991E43FBCB00781BF7 /* PCJNotificationConfig.swift in Sources */, DB10DEA31EDFDF9900DAED31 /* StoryboardIdentifiable.swift in Sources */, DB4BC6AC1EF670B600650964 /* TimetableRoomCell.swift in Sources */, DBA8723E1EF2E5320001F8A3 /* LoadFavoriteTalksRequest.swift in Sources */, - DBA872371EF2E0E90001F8A3 /* StaffListAPIRequest.swift in Sources */, DB7EAADB1EEEF76A00FEF504 /* UIImageViewExtension.swift in Sources */, DB05D1E11E43FBCB00781BF7 /* ConferenceListViewController.swift in Sources */, DB10DE9D1EDFDF3B00DAED31 /* UIStoryboardExtension.swift in Sources */, @@ -1283,11 +1306,14 @@ DB05D1A91E43FBCB00781BF7 /* TalkObject.swift in Sources */, DB05D1AF1E43FBCB00781BF7 /* Level.swift in Sources */, DB05D1A11E43FBCB00781BF7 /* ArrayExtension.swift in Sources */, + DB1140B71F5EAC8F0046442E /* TalksAPIRequest.swift in Sources */, DB05D1D31E43FBCB00781BF7 /* CustomImageView.swift in Sources */, DB05D1B61E43FBCB00781BF7 /* Timeline.swift in Sources */, DB05D1AE1E43FBCB00781BF7 /* Category.swift in Sources */, DB05D1B11E43FBCB00781BF7 /* Speaker.swift in Sources */, + DB1140B51F5EAC8F0046442E /* StaffListAPIRequest.swift in Sources */, DB05D1B21E43FBCB00781BF7 /* Staff.swift in Sources */, + DB1140B61F5EAC8F0046442E /* TalkDetailAPIRequest.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1438,6 +1464,16 @@ name = More.storyboard; sourceTree = ""; }; + DB1140BE1F604A860046442E /* MoreList.strings */ = { + isa = PBXVariantGroup; + children = ( + DB1140BD1F604A860046442E /* Base */, + DB1140BF1F604C620046442E /* en */, + DB1140C01F604C630046442E /* ja */, + ); + name = MoreList.strings; + sourceTree = ""; + }; DB51C21B1F5322D20016C952 /* EventList.strings */ = { isa = PBXVariantGroup; children = ( diff --git a/PyConJP/Model/APIRequest/StaffListAPIRequest.swift b/PyConJP/Model/APIRequest/GitHub/StaffListAPIRequest.swift similarity index 100% rename from PyConJP/Model/APIRequest/StaffListAPIRequest.swift rename to PyConJP/Model/APIRequest/GitHub/StaffListAPIRequest.swift diff --git a/PyConJP/Model/APIRequest/GitHub/SurveyURLAPIRequest.swift b/PyConJP/Model/APIRequest/GitHub/SurveyURLAPIRequest.swift new file mode 100644 index 0000000..6a30657 --- /dev/null +++ b/PyConJP/Model/APIRequest/GitHub/SurveyURLAPIRequest.swift @@ -0,0 +1,32 @@ +// +// SurveyURLAPIRequest.swift +// PyConJP +// +// Created by Yutaro Muta on 2017/09/05. +// Copyright © 2017 PyCon JP. All rights reserved. +// + +import Foundation +import APIKit +import WebAPIFramework + +struct SurveyURLAPIRequest: GitHubRequest { + + var method: HTTPMethod { + return .get + } + + var path: String { + return "surveyURL.json" + } + + func response(from object: Any, urlResponse: HTTPURLResponse) throws -> URL { + guard let dictionary = object as? [String: Any], + let urlString = dictionary["url"] as? String, + let url = URL(string: urlString) else { + throw ResponseError.unexpectedObject(object) + } + return url + } + +} diff --git a/PyConJP/Model/APIRequest/TalkDetailAPIRequest.swift b/PyConJP/Model/APIRequest/PyConJP/TalkDetailAPIRequest.swift similarity index 100% rename from PyConJP/Model/APIRequest/TalkDetailAPIRequest.swift rename to PyConJP/Model/APIRequest/PyConJP/TalkDetailAPIRequest.swift diff --git a/PyConJP/Model/APIRequest/TalksAPIRequest.swift b/PyConJP/Model/APIRequest/PyConJP/TalksAPIRequest.swift similarity index 100% rename from PyConJP/Model/APIRequest/TalksAPIRequest.swift rename to PyConJP/Model/APIRequest/PyConJP/TalksAPIRequest.swift diff --git a/PyConJP/Resource/Localizable/Base.lproj/MoreList.strings b/PyConJP/Resource/Localizable/Base.lproj/MoreList.strings new file mode 100644 index 0000000..3dec369 --- /dev/null +++ b/PyConJP/Resource/Localizable/Base.lproj/MoreList.strings @@ -0,0 +1,28 @@ +/* + MoreList.strings + PyConJP + + Created by Yutaro Muta on 2017/09/07. + Copyright © 2017 PyCon JP. All rights reserved. +*/ + +/** + MoreListViewController + */ + +"participantsInformation" = "Participants Information"; +"whatsPyConJP" = "What is PyCon JP?"; +"codeOfConduct" = "Code of Conduct"; +"summary" = "Summary"; +"sponsor" = "Sponsor"; +"staffList" = "Staff List"; +"survey" = "Survey"; + +"venue" = "Venue Information"; +"conferenceMap" = "Tutorials・Conference"; +"sprintMap" = "Sprints"; + +"application" = "About Application"; +"repository" = "Repository"; +"license" = "The MIT License (MIT)"; +"feedback" = "Feedback (Open Mail)"; diff --git a/PyConJP/Resource/Localizable/en.lproj/MoreList.strings b/PyConJP/Resource/Localizable/en.lproj/MoreList.strings new file mode 100644 index 0000000..3dec369 --- /dev/null +++ b/PyConJP/Resource/Localizable/en.lproj/MoreList.strings @@ -0,0 +1,28 @@ +/* + MoreList.strings + PyConJP + + Created by Yutaro Muta on 2017/09/07. + Copyright © 2017 PyCon JP. All rights reserved. +*/ + +/** + MoreListViewController + */ + +"participantsInformation" = "Participants Information"; +"whatsPyConJP" = "What is PyCon JP?"; +"codeOfConduct" = "Code of Conduct"; +"summary" = "Summary"; +"sponsor" = "Sponsor"; +"staffList" = "Staff List"; +"survey" = "Survey"; + +"venue" = "Venue Information"; +"conferenceMap" = "Tutorials・Conference"; +"sprintMap" = "Sprints"; + +"application" = "About Application"; +"repository" = "Repository"; +"license" = "The MIT License (MIT)"; +"feedback" = "Feedback (Open Mail)"; diff --git a/PyConJP/Resource/Localizable/ja.lproj/MoreList.strings b/PyConJP/Resource/Localizable/ja.lproj/MoreList.strings new file mode 100644 index 0000000..84db308 --- /dev/null +++ b/PyConJP/Resource/Localizable/ja.lproj/MoreList.strings @@ -0,0 +1,28 @@ +/* + MoreList.strings + PyConJP + + Created by Yutaro Muta on 2017/09/07. + Copyright © 2017 PyCon JP. All rights reserved. +*/ + +/** + MoreListViewController + */ + +"participantsInformation" = "参加の手引き"; +"whatsPyConJP" = "PyCon JPってなに?"; +"codeOfConduct" = "行動規範"; +"summary" = "開催概要"; +"sponsor" = "スポンサー"; +"staffList" = "スタッフ一覧"; +"survey" = "アンケート"; + +"venue" = "会場情報"; +"conferenceMap" = "チュートリアル・カンファレンス"; +"sprintMap" = "スプリント"; + +"application" = "このアプリについて"; +"repository" = "リポジトリ"; +"license" = "The MIT License (MIT)"; +"feedback" = "フィードバック (Mailを起動)"; diff --git a/PyConJP/Storyboard/Base.lproj/More.storyboard b/PyConJP/Storyboard/Base.lproj/More.storyboard index f65c58b..828a44e 100644 --- a/PyConJP/Storyboard/Base.lproj/More.storyboard +++ b/PyConJP/Storyboard/Base.lproj/More.storyboard @@ -259,211 +259,30 @@ Cohost: Global Software Engineering Laboratory, Waseda University - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/PyConJP/Storyboard/en.lproj/More.strings b/PyConJP/Storyboard/en.lproj/More.strings index 251f51d..426f25c 100644 --- a/PyConJP/Storyboard/en.lproj/More.strings +++ b/PyConJP/Storyboard/en.lproj/More.strings @@ -28,54 +28,6 @@ /* Class = "UIBarButtonItem"; title = " "; ObjectID = "atp-H1-RH7"; */ "atp-H1-RH7.title" = " "; -/* Class = "UILabel"; text = "Participants Information"; ObjectID = "AUO-Ab-Rn1"; */ -"AUO-Ab-Rn1.text" = "Participants Information"; - -/* Class = "UILabel"; text = "What is PyCon JP?"; ObjectID = "uwO-ra-bUh"; */ -"uwO-ra-bUh.text" = "What is PyCon JP?"; - -/* Class = "UILabel"; text = "Code of Conduct"; ObjectID = "mBD-f5-xKD"; */ -"mBD-f5-xKD.text" = "Code of Conduct"; - -/* Class = "UILabel"; text = "Summary"; ObjectID = "8dF-VI-mA2"; */ -"8dF-VI-mA2.text" = "Summary"; - -/* Class = "UILabel"; text = "Sponsor"; ObjectID = "yFZ-CD-jgB"; */ -"yFZ-CD-jgB.text" = "Sponsor"; - -/* Class = "UILabel"; text = "Staff List"; ObjectID = "fe1-28-yP9"; */ -"fe1-28-yP9.text" = "Staff List"; - -/* Class = "UILabel"; text = "Survey"; ObjectID = "Ksi-rC-XC6"; */ -"Ksi-rC-XC6.text" = "Survey"; - -/* Class = "UITableViewSection"; headerTitle = "Venue Information"; ObjectID = "OVX-Ci-m6R"; */ -"OVX-Ci-m6R.headerTitle" = "Venue Information"; - -/* Class = "UILabel"; text = "Tutorials・Conference"; ObjectID = "hoO-0c-K2E"; */ -"hoO-0c-K2E.text" = "Tutorials・Conference"; - -/* Class = "UILabel"; text = "Sprints"; ObjectID = "J3n-hJ-8rS"; */ -"J3n-hJ-8rS.text" = "Sprints"; - -/* Class = "UITableViewSection"; headerTitle = "About Application"; ObjectID = "FgW-wC-612"; */ -"FgW-wC-612.headerTitle" = "About Application"; - -/* Class = "UILabel"; text = "Repository"; ObjectID = "PYC-kg-am7"; */ -"PYC-kg-am7.text" = "Repository"; - -/* Class = "UILabel"; text = "Acknowledgments"; ObjectID = "Mrt-oQ-gLO"; */ -"Mrt-oQ-gLO.text" = "Acknowledgments"; - -/* Class = "UILabel"; text = "The MIT License (MIT)"; ObjectID = "YPP-Wn-fR4"; */ -"YPP-Wn-fR4.text" = "The MIT License (MIT)"; - -/* Class = "UILabel"; text = "Feedback (Open Mail)"; ObjectID = "TPw-fl-DhO"; */ -"TPw-fl-DhO.text" = "Feedback (Open Mail)"; - -/* Class = "UITableViewSection"; footerTitle = " "; ObjectID = "FgW-wC-612"; */ -"FgW-wC-612.footerTitle" = " "; - /** WhatsPyConJPViewController diff --git a/PyConJP/Storyboard/ja.lproj/More.strings b/PyConJP/Storyboard/ja.lproj/More.strings index 374b499..7e4101c 100644 --- a/PyConJP/Storyboard/ja.lproj/More.strings +++ b/PyConJP/Storyboard/ja.lproj/More.strings @@ -28,54 +28,6 @@ /* Class = "UIBarButtonItem"; title = " "; ObjectID = "atp-H1-RH7"; */ "atp-H1-RH7.title" = " "; -/* Class = "UILabel"; text = "Participants Information"; ObjectID = "AUO-Ab-Rn1"; */ -"AUO-Ab-Rn1.text" = "参加の手引き"; - -/* Class = "UILabel"; text = "What is PyCon JP?"; ObjectID = "uwO-ra-bUh"; */ -"uwO-ra-bUh.text" = "PyCon JPってなに?"; - -/* Class = "UILabel"; text = "Code of Conduct"; ObjectID = "mBD-f5-xKD"; */ -"mBD-f5-xKD.text" = "行動規範"; - -/* Class = "UILabel"; text = "Summary"; ObjectID = "8dF-VI-mA2"; */ -"8dF-VI-mA2.text" = "開催概要"; - -/* Class = "UILabel"; text = "Sponsor"; ObjectID = "yFZ-CD-jgB"; */ -"yFZ-CD-jgB.text" = "スポンサー"; - -/* Class = "UILabel"; text = "Staff List"; ObjectID = "fe1-28-yP9"; */ -"fe1-28-yP9.text" = "スタッフ一覧"; - -/* Class = "UILabel"; text = "Survey"; ObjectID = "Ksi-rC-XC6"; */ -"Ksi-rC-XC6.text" = "アンケート"; - -/* Class = "UITableViewSection"; headerTitle = "Venue Information"; ObjectID = "OVX-Ci-m6R"; */ -"OVX-Ci-m6R.headerTitle" = "会場情報"; - -/* Class = "UILabel"; text = "Tutorials・Conference"; ObjectID = "hoO-0c-K2E"; */ -"hoO-0c-K2E.text" = "チュートリアル・カンファレンス"; - -/* Class = "UILabel"; text = "Sprints"; ObjectID = "J3n-hJ-8rS"; */ -"J3n-hJ-8rS.text" = "スプリント"; - -/* Class = "UITableViewSection"; headerTitle = "About Application"; ObjectID = "FgW-wC-612"; */ -"FgW-wC-612.headerTitle" = "このアプリについて"; - -/* Class = "UILabel"; text = "Repository"; ObjectID = "PYC-kg-am7"; */ -"PYC-kg-am7.text" = "リポジトリ"; - -/* Class = "UILabel"; text = "Acknowledgments"; ObjectID = "Mrt-oQ-gLO"; */ -"Mrt-oQ-gLO.text" = "Acknowledgments"; - -/* Class = "UILabel"; text = "The MIT License (MIT)"; ObjectID = "YPP-Wn-fR4"; */ -"YPP-Wn-fR4.text" = "The MIT License (MIT)"; - -/* Class = "UILabel"; text = "Feedback (Open Mail)"; ObjectID = "TPw-fl-DhO"; */ -"TPw-fl-DhO.text" = "フィードバック (Mailを起動)"; - -/* Class = "UITableViewSection"; footerTitle = " "; ObjectID = "FgW-wC-612"; */ -"FgW-wC-612.footerTitle" = " "; - /** WhatsPyConJPViewController diff --git a/PyConJP/ViewController/Events/EventsListViewController.swift b/PyConJP/ViewController/Events/EventsListViewController.swift index b0072d5..6e8db06 100644 --- a/PyConJP/ViewController/Events/EventsListViewController.swift +++ b/PyConJP/ViewController/Events/EventsListViewController.swift @@ -25,7 +25,7 @@ class EventsListViewController: UITableViewController { } override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { - return sections[section].headerTitle + return sections[section].title } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { @@ -49,7 +49,7 @@ class EventsListViewController: UITableViewController { static let sections: [Section] = [.tutorialsDay, .conferenseDay, .sprintsDay] - var headerTitle: String { + var title: String { switch self { case .tutorialsDay: return "2017-09-07" diff --git a/PyConJP/ViewController/More/MoreListViewController.swift b/PyConJP/ViewController/More/MoreListViewController.swift index 49d278c..3c0e02a 100644 --- a/PyConJP/ViewController/More/MoreListViewController.swift +++ b/PyConJP/ViewController/More/MoreListViewController.swift @@ -14,6 +14,26 @@ class MoreListViewController: UITableViewController { private let sections: [Section] = Section.sections + // MARK: - Table View Controller DataSource + + override func numberOfSections(in tableView: UITableView) -> Int { + return sections.count + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return sections[section].rows.count + } + + override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + return sections[section].title + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "MoreCell", for: indexPath) + cell.textLabel?.text = sections[indexPath.section].rows[indexPath.row].title + return cell + } + // MARK: - Table View Controller Delegate override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { @@ -57,6 +77,17 @@ class MoreListViewController: UITableViewController { } } + var title: String? { + switch self { + case .about: + return nil + case .venue: + return NSLocalizedString("venue", tableName: "MoreList", comment: "") + case .application: + return NSLocalizedString("application", tableName: "MoreList", comment: "") + } + } + } private enum Row: MailURLSchemeProtocol { @@ -74,32 +105,71 @@ class MoreListViewController: UITableViewController { case license case feedback + var title: String { + switch self { + case .participantsInformation: + return NSLocalizedString("participantsInformation", tableName: "MoreList", comment: "") + case .whatsPyConJP: + return NSLocalizedString("whatsPyConJP", tableName: "MoreList", comment: "") + case .codeOfConduct: + return NSLocalizedString("codeOfConduct", tableName: "MoreList", comment: "") + case .summary: + return NSLocalizedString("summary", tableName: "MoreList", comment: "") + case .sponsor: + return NSLocalizedString("sponsor", tableName: "MoreList", comment: "") + case .staffList: + return NSLocalizedString("staffList", tableName: "MoreList", comment: "") + case .conferenceMap: + return NSLocalizedString("conferenceMap", tableName: "MoreList", comment: "") + case .sprintMap: + return NSLocalizedString("sprintMap", tableName: "MoreList", comment: "") + case .repository: + return NSLocalizedString("repository", tableName: "MoreList", comment: "") + case .license: + return NSLocalizedString("license", tableName: "MoreList", comment: "") + case .feedback: + return NSLocalizedString("feedback", tableName: "MoreList", comment: "") + } + } + var identifier: String? { switch self { - case .whatsPyConJP: return "WhatsPyConJPViewController" - case .codeOfConduct: return "CodeOfConductViewController" - case .summary: return "SummaryViewController" - case .license: return "LicenseViewController" - case .staffList: return "StaffListViewController" - default: return nil + case .whatsPyConJP: + return "WhatsPyConJPViewController" + case .codeOfConduct: + return "CodeOfConductViewController" + case .summary: + return "SummaryViewController" + case .license: + return "LicenseViewController" + case .staffList: + return "StaffListViewController" + default: + return nil } } var url: URL? { switch self { - case .participantsInformation: return URL(string: WebConfig.baseURL + "participants/") - case .sponsor: return URL(string: WebConfig.baseURL + "sponsors/") - case .repository: return URL(string: "https://github.com/pyconjp/pyconjp-ios") - default: return nil + case .participantsInformation: + return URL(string: WebConfig.baseURL + "participants/") + case .sponsor: + return URL(string: WebConfig.baseURL + "sponsors/") + case .repository: + return URL(string: "https://github.com/pyconjp/pyconjp-ios") + default: + return nil } } var urlSheme: URL? { switch self { - case .feedback: return mailURLScheme(to: PCJConfig.mailAddress, - subject: "Feedback for PyCon JP 2017 App", - body: String(format: "iOS version: %@\nDevice Model: %@\nReply-to:\n\nFeedback:", arguments: [UIDevice.current.systemVersion, UIDevice.current.modelType])) - default: return nil + case .feedback: + return mailURLScheme(to: PCJConfig.mailAddress, + subject: "Feedback for PyCon JP 2017 App", + body: String(format: "iOS version: %@\nDevice Model: %@\nReply-to:\n\nFeedback:", arguments: [UIDevice.current.systemVersion, UIDevice.current.modelType])) + default: + return nil } } From e88ee8640ad658b7211d83bcaebf76d411efa43b Mon Sep 17 00:00:00 2001 From: Yutaro Muta Date: Thu, 7 Sep 2017 19:32:22 +0900 Subject: [PATCH 2/4] Add MoreListDataStore --- PyConJP.xcodeproj/project.pbxproj | 12 ++ .../DataStore/More/MoreListDataStore.swift | 188 ++++++++++++++++++ .../More/MoreListViewController.swift | 136 ++----------- 3 files changed, 213 insertions(+), 123 deletions(-) create mode 100644 PyConJP/DataStore/More/MoreListDataStore.swift diff --git a/PyConJP.xcodeproj/project.pbxproj b/PyConJP.xcodeproj/project.pbxproj index f87f1fe..0e65d88 100644 --- a/PyConJP.xcodeproj/project.pbxproj +++ b/PyConJP.xcodeproj/project.pbxproj @@ -90,6 +90,7 @@ DB1140B71F5EAC8F0046442E /* TalksAPIRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1140B41F5EAC8F0046442E /* TalksAPIRequest.swift */; }; DB1140B91F5EACDE0046442E /* SurveyURLAPIRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1140B81F5EACDE0046442E /* SurveyURLAPIRequest.swift */; }; DB1140BC1F604A860046442E /* MoreList.strings in Resources */ = {isa = PBXBuildFile; fileRef = DB1140BE1F604A860046442E /* MoreList.strings */; }; + DB1140C51F60506D0046442E /* MoreListDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1140C41F60506D0046442E /* MoreListDataStore.swift */; }; DB28C1921F59AFB2003BEFE0 /* GitHubRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB28C1911F59AFB2003BEFE0 /* GitHubRequest.swift */; }; DB4BC68F1EF5098D00650964 /* SpreadsheetView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB4BC68E1EF5098D00650964 /* SpreadsheetView.framework */; }; DB4BC6911EF522CD00650964 /* ConferenceTimetableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4BC6901EF522CD00650964 /* ConferenceTimetableViewController.swift */; }; @@ -280,6 +281,7 @@ DB1140BD1F604A860046442E /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/MoreList.strings; sourceTree = ""; }; DB1140BF1F604C620046442E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/MoreList.strings; sourceTree = ""; }; DB1140C01F604C630046442E /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/MoreList.strings; sourceTree = ""; }; + DB1140C41F60506D0046442E /* MoreListDataStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoreListDataStore.swift; sourceTree = ""; }; DB28C1911F59AFB2003BEFE0 /* GitHubRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubRequest.swift; sourceTree = ""; }; DB4BC68E1EF5098D00650964 /* SpreadsheetView.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SpreadsheetView.framework; path = Carthage/Build/iOS/SpreadsheetView.framework; sourceTree = ""; }; DB4BC6901EF522CD00650964 /* ConferenceTimetableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConferenceTimetableViewController.swift; sourceTree = ""; }; @@ -743,6 +745,14 @@ path = PyConJP; sourceTree = ""; }; + DB1140C11F6050360046442E /* More */ = { + isa = PBXGroup; + children = ( + DB1140C41F60506D0046442E /* MoreListDataStore.swift */, + ); + path = More; + sourceTree = ""; + }; DB4BC6921EF5257200650964 /* SpreadsheetViewCell */ = { isa = PBXGroup; children = ( @@ -760,6 +770,7 @@ isa = PBXGroup; children = ( DB4BC6A61EF5925800650964 /* Conference */, + DB1140C11F6050360046442E /* More */, DB4BC6961EF5916D00650964 /* DataSource */, ); path = DataStore; @@ -1259,6 +1270,7 @@ DB7EAADB1EEEF76A00FEF504 /* UIImageViewExtension.swift in Sources */, DB05D1E11E43FBCB00781BF7 /* ConferenceListViewController.swift in Sources */, DB10DE9D1EDFDF3B00DAED31 /* UIStoryboardExtension.swift in Sources */, + DB1140C51F60506D0046442E /* MoreListDataStore.swift in Sources */, DB05D1B41E43FBCB00781BF7 /* TalkDetail.swift in Sources */, DB05D1E31E43FBCB00781BF7 /* ConferencePageViewController.swift in Sources */, DB05D1DB1E43FBCB00781BF7 /* DetailImageViewController.swift in Sources */, diff --git a/PyConJP/DataStore/More/MoreListDataStore.swift b/PyConJP/DataStore/More/MoreListDataStore.swift new file mode 100644 index 0000000..4ff947b --- /dev/null +++ b/PyConJP/DataStore/More/MoreListDataStore.swift @@ -0,0 +1,188 @@ +// +// MoreListDataStore.swift +// PyConJP +// +// Created by Yutaro Muta on 2017/09/07. +// Copyright © 2017 PyCon JP. All rights reserved. +// + +import Foundation +import APIKit +import WebAPIFramework + +final class MoreListDataStore { + + private(set) var sections: [Section] + + init(reloadData: @escaping (() -> Void)) { + self.sections = [] + getSurveyURL { + reloadData() + } + } + + private func getSurveyURL(completionHandler: @escaping (() -> Void)) { + let request = SurveyURLAPIRequest() + Session.send(request) { [weak self](result) in + switch result { + case .success(let url): + self?.sections = Section.sections(with: url) + completionHandler() + case .failure: + self?.sections = Section.sections(with: nil) + completionHandler() + } + } + } + +} + +extension MoreListDataStore { + + enum Section { + case about(rows: [Row]) + case venue(rows: [Row]) + case application(rows: [Row]) + + var title: String? { + switch self { + case .about: + return nil + case .venue: + return NSLocalizedString("venue", tableName: "MoreList", comment: "") + case .application: + return NSLocalizedString("application", tableName: "MoreList", comment: "") + } + } + + var rows: [Row] { + switch self { + case .about(let rows): + return rows + case .venue(let rows): + return rows + case .application(let rows): + return rows + } + } + + static func sections(with surveyURL: URL?) -> [Section] { + if let surveyURL = surveyURL { + return [.about(rows: [.participantsInformation, + .whatsPyConJP, + .codeOfConduct, + .summary, + .sponsor, + .staffList, + .survey(url: surveyURL)]), + .venue(rows: [.conferenceMap, + .sprintMap]), + .application(rows: [.repository, + .license, + .feedback])] + } else { + return [.about(rows: [.participantsInformation, + .whatsPyConJP, + .codeOfConduct, + .summary, + .sponsor, + .staffList]), + .venue(rows: [.conferenceMap, + .sprintMap]), + .application(rows: [.repository, + .license, + .feedback])] + } + } + + } + + enum Row: MailURLSchemeProtocol { + case participantsInformation + case whatsPyConJP + case codeOfConduct + case summary + case sponsor + case staffList + case survey(url: URL) + + case conferenceMap + case sprintMap + + case repository + case license + case feedback + + var title: String { + switch self { + case .participantsInformation: + return NSLocalizedString("participantsInformation", tableName: "MoreList", comment: "") + case .whatsPyConJP: + return NSLocalizedString("whatsPyConJP", tableName: "MoreList", comment: "") + case .codeOfConduct: + return NSLocalizedString("codeOfConduct", tableName: "MoreList", comment: "") + case .summary: + return NSLocalizedString("summary", tableName: "MoreList", comment: "") + case .sponsor: + return NSLocalizedString("sponsor", tableName: "MoreList", comment: "") + case .staffList: + return NSLocalizedString("staffList", tableName: "MoreList", comment: "") + case .survey: + return NSLocalizedString("survey", tableName: "MoreList", comment: "") + case .conferenceMap: + return NSLocalizedString("conferenceMap", tableName: "MoreList", comment: "") + case .sprintMap: + return NSLocalizedString("sprintMap", tableName: "MoreList", comment: "") + case .repository: + return NSLocalizedString("repository", tableName: "MoreList", comment: "") + case .license: + return NSLocalizedString("license", tableName: "MoreList", comment: "") + case .feedback: + return NSLocalizedString("feedback", tableName: "MoreList", comment: "") + } + } + + var identifier: String? { + switch self { + case .whatsPyConJP: + return "WhatsPyConJPViewController" + case .codeOfConduct: + return "CodeOfConductViewController" + case .summary: + return "SummaryViewController" + case .license: + return "LicenseViewController" + case .staffList: + return "StaffListViewController" + default: + return nil + } + } + + var url: URL? { + switch self { + case .participantsInformation: + return URL(string: WebConfig.baseURL + "participants/") + case .sponsor: + return URL(string: WebConfig.baseURL + "sponsors/") + case .repository: + return URL(string: "https://github.com/pyconjp/pyconjp-ios") + default: + return nil + } + } + + var urlSheme: URL? { + switch self { + case .feedback: + return mailURLScheme(to: PCJConfig.mailAddress, + subject: "Feedback for PyCon JP 2017 App", + body: String(format: "iOS version: %@\nDevice Model: %@\nReply-to:\n\nFeedback:", arguments: [UIDevice.current.systemVersion, UIDevice.current.modelType])) + default: + return nil + } + } + + } + +} diff --git a/PyConJP/ViewController/More/MoreListViewController.swift b/PyConJP/ViewController/More/MoreListViewController.swift index 3c0e02a..5207efc 100644 --- a/PyConJP/ViewController/More/MoreListViewController.swift +++ b/PyConJP/ViewController/More/MoreListViewController.swift @@ -7,37 +7,40 @@ // import UIKit -import WebAPIFramework import SafariServices class MoreListViewController: UITableViewController { - private let sections: [Section] = Section.sections + private lazy var dataStore: MoreListDataStore = MoreListDataStore { [weak self] in + DispatchQueue.main.async { + self?.tableView.reloadData() + } + } // MARK: - Table View Controller DataSource override func numberOfSections(in tableView: UITableView) -> Int { - return sections.count + return dataStore.sections.count } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return sections[section].rows.count + return dataStore.sections[section].rows.count } override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { - return sections[section].title + return dataStore.sections[section].title } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "MoreCell", for: indexPath) - cell.textLabel?.text = sections[indexPath.section].rows[indexPath.row].title + cell.textLabel?.text = dataStore.sections[indexPath.section].rows[indexPath.row].title return cell } // MARK: - Table View Controller Delegate override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - let row = sections[indexPath.section].rows[indexPath.row] + let row = dataStore.sections[indexPath.section].rows[indexPath.row] switch row { case .whatsPyConJP, .codeOfConduct, .summary, .license, .staffList: guard let identifier = row.identifier, let viewController = self.storyboard?.instantiateViewController(withIdentifier: identifier) else { return } @@ -46,6 +49,9 @@ class MoreListViewController: UITableViewController { guard let url = row.url else { return } let safariViewController = SFSafariViewController(url: url) self.present(safariViewController, animated: true, completion: nil) + case .survey(let url): + let safariViewController = SFSafariViewController(url: url) + self.present(safariViewController, animated: true, completion: nil) case .conferenceMap: let mapListViewController = MapListViewController.build() self.navigationController?.pushViewController(mapListViewController, animated: true) @@ -59,120 +65,4 @@ class MoreListViewController: UITableViewController { } } - private enum Section: Int { - case about - case venue - case application - - static let sections: [Section] = [.about, .venue, .application] - - var rows: [Row] { - switch self { - case .about: - return [.participantsInformation, .whatsPyConJP, .codeOfConduct, .summary, .sponsor, .staffList] - case .venue: - return [.conferenceMap, .sprintMap] - case .application: - return [.repository, .license, .feedback] - } - } - - var title: String? { - switch self { - case .about: - return nil - case .venue: - return NSLocalizedString("venue", tableName: "MoreList", comment: "") - case .application: - return NSLocalizedString("application", tableName: "MoreList", comment: "") - } - } - - } - - private enum Row: MailURLSchemeProtocol { - case participantsInformation - case whatsPyConJP - case codeOfConduct - case summary - case sponsor - case staffList - - case conferenceMap - case sprintMap - - case repository - case license - case feedback - - var title: String { - switch self { - case .participantsInformation: - return NSLocalizedString("participantsInformation", tableName: "MoreList", comment: "") - case .whatsPyConJP: - return NSLocalizedString("whatsPyConJP", tableName: "MoreList", comment: "") - case .codeOfConduct: - return NSLocalizedString("codeOfConduct", tableName: "MoreList", comment: "") - case .summary: - return NSLocalizedString("summary", tableName: "MoreList", comment: "") - case .sponsor: - return NSLocalizedString("sponsor", tableName: "MoreList", comment: "") - case .staffList: - return NSLocalizedString("staffList", tableName: "MoreList", comment: "") - case .conferenceMap: - return NSLocalizedString("conferenceMap", tableName: "MoreList", comment: "") - case .sprintMap: - return NSLocalizedString("sprintMap", tableName: "MoreList", comment: "") - case .repository: - return NSLocalizedString("repository", tableName: "MoreList", comment: "") - case .license: - return NSLocalizedString("license", tableName: "MoreList", comment: "") - case .feedback: - return NSLocalizedString("feedback", tableName: "MoreList", comment: "") - } - } - - var identifier: String? { - switch self { - case .whatsPyConJP: - return "WhatsPyConJPViewController" - case .codeOfConduct: - return "CodeOfConductViewController" - case .summary: - return "SummaryViewController" - case .license: - return "LicenseViewController" - case .staffList: - return "StaffListViewController" - default: - return nil - } - } - - var url: URL? { - switch self { - case .participantsInformation: - return URL(string: WebConfig.baseURL + "participants/") - case .sponsor: - return URL(string: WebConfig.baseURL + "sponsors/") - case .repository: - return URL(string: "https://github.com/pyconjp/pyconjp-ios") - default: - return nil - } - } - - var urlSheme: URL? { - switch self { - case .feedback: - return mailURLScheme(to: PCJConfig.mailAddress, - subject: "Feedback for PyCon JP 2017 App", - body: String(format: "iOS version: %@\nDevice Model: %@\nReply-to:\n\nFeedback:", arguments: [UIDevice.current.systemVersion, UIDevice.current.modelType])) - default: - return nil - } - } - - } - } From d984fa0e3a8fd8e65819db15462c31232953e6c9 Mon Sep 17 00:00:00 2001 From: Yutaro Muta Date: Fri, 8 Sep 2017 00:38:02 +0900 Subject: [PATCH 3/4] Fix a bug for can not push stop button at ZoomableImageViewController --- PyConJP/Storyboard/Base.lproj/Main.storyboard | 63 +++++++++++++++---- PyConJP/Storyboard/Base.lproj/More.storyboard | 1 + 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/PyConJP/Storyboard/Base.lproj/Main.storyboard b/PyConJP/Storyboard/Base.lproj/Main.storyboard index c0accbd..4315791 100644 --- a/PyConJP/Storyboard/Base.lproj/Main.storyboard +++ b/PyConJP/Storyboard/Base.lproj/Main.storyboard @@ -1,7 +1,10 @@ - + + + + - + @@ -9,7 +12,7 @@ - + @@ -23,7 +26,7 @@ - + @@ -33,33 +36,42 @@ + + + + - @@ -79,18 +91,22 @@ + +