Current transformation stage
5
.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
Cartfile.resolved
|
||||
Carthage/
|
||||
Zockerhoehle.xcodeproj/project.xcworkspace/xcuserdata/
|
||||
Zockerhoehle.xcodeproj/xcuserdata/julian.xcuserdatad/xcdebugger/
|
||||
Zockerhoehle.xcodeproj/xcuserdata/julian.xcuserdatad/xcschemes/Zockerhoehle.xcscheme
|
||||
52
Zockerhoehle copy-Info.plist
Normal file
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>Zockerhöhle</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
<dict>
|
||||
<key>NSAllowsArbitraryLoads</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
<string>Main</string>
|
||||
<key>UIRequiredDeviceCapabilities</key>
|
||||
<array>
|
||||
<string>armv7</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -7,21 +7,89 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
B926F12B2149B173004D36B7 /* ConsoleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B926F12A2149B173004D36B7 /* ConsoleCell.swift */; };
|
||||
B926F12D2149B264004D36B7 /* FlockeEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = B926F12C2149B264004D36B7 /* FlockeEntry.swift */; };
|
||||
B926F131214AD9E4004D36B7 /* GameCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = B926F130214AD9E4004D36B7 /* GameCollection.swift */; };
|
||||
B926F139214AE884004D36B7 /* FlockeWS.swift in Sources */ = {isa = PBXBuildFile; fileRef = B926F138214AE884004D36B7 /* FlockeWS.swift */; };
|
||||
B926F13C214C44FE004D36B7 /* Attachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = B926F13B214C44FE004D36B7 /* Attachment.swift */; };
|
||||
B926F13F214E4678004D36B7 /* GameCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B926F13E214E4678004D36B7 /* GameCell.swift */; };
|
||||
B926F14721502D53004D36B7 /* CodableExtensionAny.swift in Sources */ = {isa = PBXBuildFile; fileRef = B926F14621502D53004D36B7 /* CodableExtensionAny.swift */; };
|
||||
B926F14A21502DE1004D36B7 /* ConsoleEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = B926F14921502DE1004D36B7 /* ConsoleEntry.swift */; };
|
||||
B93C1B9D21496BFD0014FD6E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B93C1B9C21496BFD0014FD6E /* AppDelegate.swift */; };
|
||||
B93C1B9F21496BFD0014FD6E /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B93C1B9E21496BFD0014FD6E /* ViewController.swift */; };
|
||||
B93C1BA221496BFD0014FD6E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B93C1BA021496BFD0014FD6E /* Main.storyboard */; };
|
||||
B93C1BA421496BFE0014FD6E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B93C1BA321496BFE0014FD6E /* Assets.xcassets */; };
|
||||
B93C1BA721496BFE0014FD6E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B93C1BA521496BFE0014FD6E /* LaunchScreen.storyboard */; };
|
||||
B93C1BB02149750E0014FD6E /* AllConsolesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B93C1BAF2149750E0014FD6E /* AllConsolesViewController.swift */; };
|
||||
B93D60CC22D88F2B00DD390F /* AccessoryDetailController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B93D60CB22D88F2B00DD390F /* AccessoryDetailController.swift */; };
|
||||
B93D60CE22D88F5700DD390F /* AccessoryDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B93D60CD22D88F5700DD390F /* AccessoryDetailView.swift */; };
|
||||
B9418449215422ED0050D099 /* AddEntryPopUpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9418448215422ED0050D099 /* AddEntryPopUpViewController.swift */; };
|
||||
B941844B2156891E0050D099 /* UIButtonX.swift in Sources */ = {isa = PBXBuildFile; fileRef = B941844A2156891E0050D099 /* UIButtonX.swift */; };
|
||||
B94CB4FF22D1352F0029BFAD /* Accessory+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94CB4F322D1352F0029BFAD /* Accessory+CoreDataClass.swift */; };
|
||||
B94CB50022D1352F0029BFAD /* Accessory+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94CB4F422D1352F0029BFAD /* Accessory+CoreDataProperties.swift */; };
|
||||
B94CB50122D1352F0029BFAD /* Cover+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94CB4F522D1352F0029BFAD /* Cover+CoreDataClass.swift */; };
|
||||
B94CB50222D1352F0029BFAD /* Cover+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94CB4F622D1352F0029BFAD /* Cover+CoreDataProperties.swift */; };
|
||||
B94CB50322D1352F0029BFAD /* Game+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94CB4F722D1352F0029BFAD /* Game+CoreDataClass.swift */; };
|
||||
B94CB50422D1352F0029BFAD /* Game+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94CB4F822D1352F0029BFAD /* Game+CoreDataProperties.swift */; };
|
||||
B94CB50522D1352F0029BFAD /* Console+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94CB4F922D1352F0029BFAD /* Console+CoreDataClass.swift */; };
|
||||
B94CB50622D1352F0029BFAD /* Console+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94CB4FA22D1352F0029BFAD /* Console+CoreDataProperties.swift */; };
|
||||
B94CB50722D1352F0029BFAD /* GameSeries+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94CB4FB22D1352F0029BFAD /* GameSeries+CoreDataClass.swift */; };
|
||||
B94CB50822D1352F0029BFAD /* GameSeries+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94CB4FC22D1352F0029BFAD /* GameSeries+CoreDataProperties.swift */; };
|
||||
B94CB50922D1352F0029BFAD /* Logo+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94CB4FD22D1352F0029BFAD /* Logo+CoreDataClass.swift */; };
|
||||
B94CB50A22D1352F0029BFAD /* Logo+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94CB4FE22D1352F0029BFAD /* Logo+CoreDataProperties.swift */; };
|
||||
B94CB53722D3B3CC0029BFAD /* GameDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94CB53622D3B3CC0029BFAD /* GameDetailView.swift */; };
|
||||
B94CB53922D3B6490029BFAD /* GameDetailController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94CB53822D3B6490029BFAD /* GameDetailController.swift */; };
|
||||
B98A734D22BAD27D00FB3410 /* Zockerhoehle.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = B98A731722BA9E4600FB3410 /* Zockerhoehle.xcdatamodeld */; };
|
||||
B98A735E22BFAA4B00FB3410 /* ConsoleLibraryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B926F12E2149B6F5004D36B7 /* ConsoleLibraryViewController.swift */; };
|
||||
B98A736022C1738800FB3410 /* CDManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98A735F22C1738800FB3410 /* CDManager.swift */; };
|
||||
B9BCF4CA2168ACB600ECBAAC /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B9BCF4C92168ACB600ECBAAC /* LaunchScreen.storyboard */; };
|
||||
B9BCF523217900D700ECBAAC /* WaitingPopOver.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B9BCF521217900D700ECBAAC /* WaitingPopOver.storyboard */; };
|
||||
B9D6A39A22D885DD00A280DC /* AccessoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9D6A39922D885DD00A280DC /* AccessoryCell.swift */; };
|
||||
B9E256FE2156D026009FD133 /* UIViewX.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9E256FD2156D026009FD133 /* UIViewX.swift */; };
|
||||
B9F002E52187AA3200E12B0A /* FlockeConnector.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9F002E42187AA3200E12B0A /* FlockeConnector.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
B926F12A2149B173004D36B7 /* ConsoleCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConsoleCell.swift; sourceTree = "<group>"; };
|
||||
B926F12C2149B264004D36B7 /* FlockeEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlockeEntry.swift; sourceTree = "<group>"; };
|
||||
B926F12E2149B6F5004D36B7 /* ConsoleLibraryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConsoleLibraryViewController.swift; sourceTree = "<group>"; };
|
||||
B926F130214AD9E4004D36B7 /* GameCollection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameCollection.swift; sourceTree = "<group>"; };
|
||||
B926F138214AE884004D36B7 /* FlockeWS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlockeWS.swift; sourceTree = "<group>"; };
|
||||
B926F13B214C44FE004D36B7 /* Attachment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Attachment.swift; sourceTree = "<group>"; };
|
||||
B926F13E214E4678004D36B7 /* GameCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameCell.swift; sourceTree = "<group>"; };
|
||||
B926F14621502D53004D36B7 /* CodableExtensionAny.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodableExtensionAny.swift; sourceTree = "<group>"; };
|
||||
B926F14921502DE1004D36B7 /* ConsoleEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConsoleEntry.swift; sourceTree = "<group>"; };
|
||||
B93C1B9921496BFD0014FD6E /* Zockerhoehle.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Zockerhoehle.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
B93C1B9C21496BFD0014FD6E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
B93C1B9E21496BFD0014FD6E /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
|
||||
B93C1BA121496BFD0014FD6E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
||||
B93C1BA321496BFE0014FD6E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
B93C1BA621496BFE0014FD6E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
B93C1BA821496BFE0014FD6E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
B93C1BAE21496CC50014FD6E /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Main.strings; sourceTree = "<group>"; };
|
||||
B93C1BAF2149750E0014FD6E /* AllConsolesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllConsolesViewController.swift; sourceTree = "<group>"; };
|
||||
B93D60CB22D88F2B00DD390F /* AccessoryDetailController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessoryDetailController.swift; sourceTree = "<group>"; };
|
||||
B93D60CD22D88F5700DD390F /* AccessoryDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessoryDetailView.swift; sourceTree = "<group>"; };
|
||||
B9418448215422ED0050D099 /* AddEntryPopUpViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddEntryPopUpViewController.swift; sourceTree = "<group>"; };
|
||||
B941844A2156891E0050D099 /* UIButtonX.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIButtonX.swift; sourceTree = "<group>"; };
|
||||
B94CB4F322D1352F0029BFAD /* Accessory+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Accessory+CoreDataClass.swift"; sourceTree = "<group>"; };
|
||||
B94CB4F422D1352F0029BFAD /* Accessory+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Accessory+CoreDataProperties.swift"; sourceTree = "<group>"; };
|
||||
B94CB4F522D1352F0029BFAD /* Cover+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Cover+CoreDataClass.swift"; sourceTree = "<group>"; };
|
||||
B94CB4F622D1352F0029BFAD /* Cover+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Cover+CoreDataProperties.swift"; sourceTree = "<group>"; };
|
||||
B94CB4F722D1352F0029BFAD /* Game+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Game+CoreDataClass.swift"; sourceTree = "<group>"; };
|
||||
B94CB4F822D1352F0029BFAD /* Game+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Game+CoreDataProperties.swift"; sourceTree = "<group>"; };
|
||||
B94CB4F922D1352F0029BFAD /* Console+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Console+CoreDataClass.swift"; sourceTree = "<group>"; };
|
||||
B94CB4FA22D1352F0029BFAD /* Console+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Console+CoreDataProperties.swift"; sourceTree = "<group>"; };
|
||||
B94CB4FB22D1352F0029BFAD /* GameSeries+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GameSeries+CoreDataClass.swift"; sourceTree = "<group>"; };
|
||||
B94CB4FC22D1352F0029BFAD /* GameSeries+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GameSeries+CoreDataProperties.swift"; sourceTree = "<group>"; };
|
||||
B94CB4FD22D1352F0029BFAD /* Logo+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Logo+CoreDataClass.swift"; sourceTree = "<group>"; };
|
||||
B94CB4FE22D1352F0029BFAD /* Logo+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Logo+CoreDataProperties.swift"; sourceTree = "<group>"; };
|
||||
B94CB53522D3708F0029BFAD /* Zockerhoehle copy-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Zockerhoehle copy-Info.plist"; path = "/Users/julian/Entwicklung/Zockerhoehle/Zockerhoehle copy-Info.plist"; sourceTree = "<absolute>"; };
|
||||
B94CB53622D3B3CC0029BFAD /* GameDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameDetailView.swift; sourceTree = "<group>"; };
|
||||
B94CB53822D3B6490029BFAD /* GameDetailController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameDetailController.swift; sourceTree = "<group>"; };
|
||||
B98A731822BA9E4600FB3410 /* Zockerhoehle.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Zockerhoehle.xcdatamodel; sourceTree = "<group>"; };
|
||||
B98A735F22C1738800FB3410 /* CDManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CDManager.swift; sourceTree = "<group>"; };
|
||||
B9BCF4C92168ACB600ECBAAC /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
B9BCF522217900D700ECBAAC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Zockerhoehle/Base.lproj/WaitingPopOver.storyboard; sourceTree = "<group>"; };
|
||||
B9D6A39922D885DD00A280DC /* AccessoryCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessoryCell.swift; sourceTree = "<group>"; };
|
||||
B9E256FD2156D026009FD133 /* UIViewX.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewX.swift; sourceTree = "<group>"; };
|
||||
B9F002E42187AA3200E12B0A /* FlockeConnector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlockeConnector.swift; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -35,11 +103,74 @@
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
B90B64A12235909900E54BA3 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B926F134214AE2C0004D36B7 /* Model */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B926F130214AD9E4004D36B7 /* GameCollection.swift */,
|
||||
B926F13B214C44FE004D36B7 /* Attachment.swift */,
|
||||
B926F12C2149B264004D36B7 /* FlockeEntry.swift */,
|
||||
B926F14921502DE1004D36B7 /* ConsoleEntry.swift */,
|
||||
);
|
||||
path = Model;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B926F135214AE2D4004D36B7 /* ViewController */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B926F12E2149B6F5004D36B7 /* ConsoleLibraryViewController.swift */,
|
||||
B93C1BAF2149750E0014FD6E /* AllConsolesViewController.swift */,
|
||||
B9418448215422ED0050D099 /* AddEntryPopUpViewController.swift */,
|
||||
B94CB53822D3B6490029BFAD /* GameDetailController.swift */,
|
||||
B93D60CB22D88F2B00DD390F /* AccessoryDetailController.swift */,
|
||||
);
|
||||
path = ViewController;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B926F136214AE2E3004D36B7 /* Views */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B926F12A2149B173004D36B7 /* ConsoleCell.swift */,
|
||||
B926F13E214E4678004D36B7 /* GameCell.swift */,
|
||||
B94CB53622D3B3CC0029BFAD /* GameDetailView.swift */,
|
||||
B9D6A39922D885DD00A280DC /* AccessoryCell.swift */,
|
||||
B93D60CD22D88F5700DD390F /* AccessoryDetailView.swift */,
|
||||
);
|
||||
path = Views;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B926F13A214AF21B004D36B7 /* Utils */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B926F138214AE884004D36B7 /* FlockeWS.swift */,
|
||||
B9F002E42187AA3200E12B0A /* FlockeConnector.swift */,
|
||||
);
|
||||
path = Utils;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B926F14821502D7F004D36B7 /* Lib */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B926F14621502D53004D36B7 /* CodableExtensionAny.swift */,
|
||||
B941844A2156891E0050D099 /* UIButtonX.swift */,
|
||||
B9E256FD2156D026009FD133 /* UIViewX.swift */,
|
||||
);
|
||||
path = Lib;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B93C1B9021496BFD0014FD6E = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B93C1B9B21496BFD0014FD6E /* Zockerhoehle */,
|
||||
B93C1B9A21496BFD0014FD6E /* Products */,
|
||||
B90B64A12235909900E54BA3 /* Frameworks */,
|
||||
B94CB53522D3708F0029BFAD /* Zockerhoehle copy-Info.plist */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@@ -54,16 +185,43 @@
|
||||
B93C1B9B21496BFD0014FD6E /* Zockerhoehle */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B98A734622BACA9C00FB3410 /* CDModel */,
|
||||
B926F14821502D7F004D36B7 /* Lib */,
|
||||
B926F13A214AF21B004D36B7 /* Utils */,
|
||||
B926F136214AE2E3004D36B7 /* Views */,
|
||||
B926F135214AE2D4004D36B7 /* ViewController */,
|
||||
B926F134214AE2C0004D36B7 /* Model */,
|
||||
B93C1B9C21496BFD0014FD6E /* AppDelegate.swift */,
|
||||
B93C1B9E21496BFD0014FD6E /* ViewController.swift */,
|
||||
B9BCF521217900D700ECBAAC /* WaitingPopOver.storyboard */,
|
||||
B93C1BA021496BFD0014FD6E /* Main.storyboard */,
|
||||
B9BCF4C92168ACB600ECBAAC /* LaunchScreen.storyboard */,
|
||||
B98A735F22C1738800FB3410 /* CDManager.swift */,
|
||||
B93C1BA321496BFE0014FD6E /* Assets.xcassets */,
|
||||
B93C1BA521496BFE0014FD6E /* LaunchScreen.storyboard */,
|
||||
B93C1BA821496BFE0014FD6E /* Info.plist */,
|
||||
B98A731722BA9E4600FB3410 /* Zockerhoehle.xcdatamodeld */,
|
||||
);
|
||||
path = Zockerhoehle;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B98A734622BACA9C00FB3410 /* CDModel */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B94CB4F322D1352F0029BFAD /* Accessory+CoreDataClass.swift */,
|
||||
B94CB4F422D1352F0029BFAD /* Accessory+CoreDataProperties.swift */,
|
||||
B94CB4F522D1352F0029BFAD /* Cover+CoreDataClass.swift */,
|
||||
B94CB4F622D1352F0029BFAD /* Cover+CoreDataProperties.swift */,
|
||||
B94CB4F722D1352F0029BFAD /* Game+CoreDataClass.swift */,
|
||||
B94CB4F822D1352F0029BFAD /* Game+CoreDataProperties.swift */,
|
||||
B94CB4F922D1352F0029BFAD /* Console+CoreDataClass.swift */,
|
||||
B94CB4FA22D1352F0029BFAD /* Console+CoreDataProperties.swift */,
|
||||
B94CB4FB22D1352F0029BFAD /* GameSeries+CoreDataClass.swift */,
|
||||
B94CB4FC22D1352F0029BFAD /* GameSeries+CoreDataProperties.swift */,
|
||||
B94CB4FD22D1352F0029BFAD /* Logo+CoreDataClass.swift */,
|
||||
B94CB4FE22D1352F0029BFAD /* Logo+CoreDataProperties.swift */,
|
||||
);
|
||||
path = CDModel;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
@@ -74,6 +232,7 @@
|
||||
B93C1B9521496BFD0014FD6E /* Sources */,
|
||||
B93C1B9621496BFD0014FD6E /* Frameworks */,
|
||||
B93C1B9721496BFD0014FD6E /* Resources */,
|
||||
B90B64A4223590DA00E54BA3 /* ShellScript */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -96,6 +255,7 @@
|
||||
TargetAttributes = {
|
||||
B93C1B9821496BFD0014FD6E = {
|
||||
CreatedOnToolsVersion = 9.4.1;
|
||||
LastSwiftMigration = 1020;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -106,6 +266,7 @@
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
de,
|
||||
);
|
||||
mainGroup = B93C1B9021496BFD0014FD6E;
|
||||
productRefGroup = B93C1B9A21496BFD0014FD6E /* Products */;
|
||||
@@ -122,21 +283,75 @@
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
B93C1BA721496BFE0014FD6E /* LaunchScreen.storyboard in Resources */,
|
||||
B9BCF4CA2168ACB600ECBAAC /* LaunchScreen.storyboard in Resources */,
|
||||
B93C1BA421496BFE0014FD6E /* Assets.xcassets in Resources */,
|
||||
B9BCF523217900D700ECBAAC /* WaitingPopOver.storyboard in Resources */,
|
||||
B93C1BA221496BFD0014FD6E /* Main.storyboard in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
B90B64A4223590DA00E54BA3 /* ShellScript */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
);
|
||||
inputPaths = (
|
||||
"$(SRCROOT)/Carthage/Build/iOS/Disk.framework",
|
||||
);
|
||||
outputFileListPaths = (
|
||||
);
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "/usr/local/bin/carthage copy-frameworks\n";
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
B93C1B9521496BFD0014FD6E /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
B93C1B9F21496BFD0014FD6E /* ViewController.swift in Sources */,
|
||||
B94CB53922D3B6490029BFAD /* GameDetailController.swift in Sources */,
|
||||
B926F139214AE884004D36B7 /* FlockeWS.swift in Sources */,
|
||||
B926F13C214C44FE004D36B7 /* Attachment.swift in Sources */,
|
||||
B93C1B9D21496BFD0014FD6E /* AppDelegate.swift in Sources */,
|
||||
B94CB53722D3B3CC0029BFAD /* GameDetailView.swift in Sources */,
|
||||
B94CB50322D1352F0029BFAD /* Game+CoreDataClass.swift in Sources */,
|
||||
B94CB50822D1352F0029BFAD /* GameSeries+CoreDataProperties.swift in Sources */,
|
||||
B93C1BB02149750E0014FD6E /* AllConsolesViewController.swift in Sources */,
|
||||
B926F13F214E4678004D36B7 /* GameCell.swift in Sources */,
|
||||
B9F002E52187AA3200E12B0A /* FlockeConnector.swift in Sources */,
|
||||
B94CB50A22D1352F0029BFAD /* Logo+CoreDataProperties.swift in Sources */,
|
||||
B94CB4FF22D1352F0029BFAD /* Accessory+CoreDataClass.swift in Sources */,
|
||||
B98A734D22BAD27D00FB3410 /* Zockerhoehle.xcdatamodeld in Sources */,
|
||||
B9E256FE2156D026009FD133 /* UIViewX.swift in Sources */,
|
||||
B926F12B2149B173004D36B7 /* ConsoleCell.swift in Sources */,
|
||||
B926F12D2149B264004D36B7 /* FlockeEntry.swift in Sources */,
|
||||
B98A735E22BFAA4B00FB3410 /* ConsoleLibraryViewController.swift in Sources */,
|
||||
B94CB50522D1352F0029BFAD /* Console+CoreDataClass.swift in Sources */,
|
||||
B941844B2156891E0050D099 /* UIButtonX.swift in Sources */,
|
||||
B94CB50922D1352F0029BFAD /* Logo+CoreDataClass.swift in Sources */,
|
||||
B94CB50622D1352F0029BFAD /* Console+CoreDataProperties.swift in Sources */,
|
||||
B926F131214AD9E4004D36B7 /* GameCollection.swift in Sources */,
|
||||
B93D60CE22D88F5700DD390F /* AccessoryDetailView.swift in Sources */,
|
||||
B926F14A21502DE1004D36B7 /* ConsoleEntry.swift in Sources */,
|
||||
B93D60CC22D88F2B00DD390F /* AccessoryDetailController.swift in Sources */,
|
||||
B94CB50722D1352F0029BFAD /* GameSeries+CoreDataClass.swift in Sources */,
|
||||
B9418449215422ED0050D099 /* AddEntryPopUpViewController.swift in Sources */,
|
||||
B94CB50022D1352F0029BFAD /* Accessory+CoreDataProperties.swift in Sources */,
|
||||
B9D6A39A22D885DD00A280DC /* AccessoryCell.swift in Sources */,
|
||||
B926F14721502D53004D36B7 /* CodableExtensionAny.swift in Sources */,
|
||||
B94CB50422D1352F0029BFAD /* Game+CoreDataProperties.swift in Sources */,
|
||||
B98A736022C1738800FB3410 /* CDManager.swift in Sources */,
|
||||
B94CB50222D1352F0029BFAD /* Cover+CoreDataProperties.swift in Sources */,
|
||||
B94CB50122D1352F0029BFAD /* Cover+CoreDataClass.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -147,16 +362,17 @@
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
B93C1BA121496BFD0014FD6E /* Base */,
|
||||
B93C1BAE21496CC50014FD6E /* de */,
|
||||
);
|
||||
name = Main.storyboard;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B93C1BA521496BFE0014FD6E /* LaunchScreen.storyboard */ = {
|
||||
B9BCF521217900D700ECBAAC /* WaitingPopOver.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
B93C1BA621496BFE0014FD6E /* Base */,
|
||||
B9BCF522217900D700ECBAAC /* Base */,
|
||||
);
|
||||
name = LaunchScreen.storyboard;
|
||||
name = WaitingPopOver.storyboard;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXVariantGroup section */
|
||||
@@ -166,6 +382,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||
@@ -213,7 +430,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.4;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
@@ -226,6 +443,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||
@@ -267,7 +485,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.4;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
@@ -282,6 +500,10 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
DEVELOPMENT_TEAM = M9N7K3KZX9;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Carthage/Build/iOS",
|
||||
);
|
||||
INFOPLIST_FILE = Zockerhoehle/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@@ -289,7 +511,7 @@
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "de.mm-neuemedien.Zockerhoehle";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 4.0;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = Debug;
|
||||
@@ -300,6 +522,10 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
DEVELOPMENT_TEAM = M9N7K3KZX9;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Carthage/Build/iOS",
|
||||
);
|
||||
INFOPLIST_FILE = Zockerhoehle/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@@ -307,7 +533,7 @@
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "de.mm-neuemedien.Zockerhoehle";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 4.0;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = Release;
|
||||
@@ -334,6 +560,19 @@
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
|
||||
/* Begin XCVersionGroup section */
|
||||
B98A731722BA9E4600FB3410 /* Zockerhoehle.xcdatamodeld */ = {
|
||||
isa = XCVersionGroup;
|
||||
children = (
|
||||
B98A731822BA9E4600FB3410 /* Zockerhoehle.xcdatamodel */,
|
||||
);
|
||||
currentVersion = B98A731822BA9E4600FB3410 /* Zockerhoehle.xcdatamodel */;
|
||||
path = Zockerhoehle.xcdatamodeld;
|
||||
sourceTree = "<group>";
|
||||
versionGroupType = wrapper.xcdatamodel;
|
||||
};
|
||||
/* End XCVersionGroup section */
|
||||
};
|
||||
rootObject = B93C1B9121496BFD0014FD6E /* Project object */;
|
||||
}
|
||||
|
||||
@@ -4,11 +4,24 @@
|
||||
<dict>
|
||||
<key>SchemeUserState</key>
|
||||
<dict>
|
||||
<key>Zockerhoehle copy.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<key>Zockerhoehle.xcscheme</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>SuppressBuildableAutocreation</key>
|
||||
<dict>
|
||||
<key>B93C1B9821496BFD0014FD6E</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -7,15 +7,23 @@
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import CoreData
|
||||
|
||||
@UIApplicationMain
|
||||
class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||
|
||||
var window: UIWindow?
|
||||
|
||||
|
||||
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
|
||||
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
|
||||
// Override point for customization after application launch.
|
||||
#if targetEnvironment(simulator)
|
||||
if let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.path {
|
||||
print("Documents Directory: \(documentsPath)")
|
||||
}
|
||||
#endif
|
||||
|
||||
print("disFinishLaunchung")
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -40,7 +48,5 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||
func applicationWillTerminate(_ application: UIApplication) {
|
||||
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,93 +1,111 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "20x20",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-40.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "20x20",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-60.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-58.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-87.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-80.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-121.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-120.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-180.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "20x20",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-20.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "20x20",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-41.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-29.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-59.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-42.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-81.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-76.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-152.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "83.5x83.5",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-167.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ios-marketing",
|
||||
"size" : "1024x1024",
|
||||
"idiom" : "ios-marketing",
|
||||
"filename" : "Icon-1024.png",
|
||||
"scale" : "1x"
|
||||
}
|
||||
],
|
||||
|
||||
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-1024.png
Normal file
|
After Width: | Height: | Size: 436 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-120.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-121.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-152.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-167.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-180.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-20.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-29.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-40.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-41.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-42.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-58.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-59.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-60.png
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-76.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-80.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-81.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
Zockerhoehle/Assets.xcassets/AppIcon.appiconset/Icon-87.png
Normal file
|
After Width: | Height: | Size: 8.3 KiB |
21
Zockerhoehle/Assets.xcassets/LaunchScreen.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Default-2436h.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
BIN
Zockerhoehle/Assets.xcassets/LaunchScreen.imageset/Default-2436h.png
vendored
Normal file
|
After Width: | Height: | Size: 833 KiB |
21
Zockerhoehle/Assets.xcassets/basket.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "basket-supermarket.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
BIN
Zockerhoehle/Assets.xcassets/basket.imageset/basket-supermarket.png
vendored
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
21
Zockerhoehle/Assets.xcassets/cave.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "cave-2.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
BIN
Zockerhoehle/Assets.xcassets/cave.imageset/cave-2.png
vendored
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
21
Zockerhoehle/Assets.xcassets/delete.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "delete.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
BIN
Zockerhoehle/Assets.xcassets/delete.imageset/delete.png
vendored
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
21
Zockerhoehle/Assets.xcassets/star.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "star.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
BIN
Zockerhoehle/Assets.xcassets/star.imageset/star.png
vendored
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
@@ -1,25 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" systemVersion="17A277" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--View Controller-->
|
||||
<scene sceneID="EHf-IW-A2E">
|
||||
<objects>
|
||||
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="53" y="375"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
||||
@@ -1,24 +1,504 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" systemVersion="17A277" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14835.7" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="4Jr-WK-1Jd">
|
||||
<device id="retina6_5" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14790.5"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--View Controller-->
|
||||
<!--Navigation Controller-->
|
||||
<scene sceneID="WWg-fs-aL3">
|
||||
<objects>
|
||||
<navigationController id="4Jr-WK-1Jd" sceneMemberID="viewController">
|
||||
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
||||
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="QE9-g3-VVe">
|
||||
<rect key="frame" x="0.0" y="44" width="414" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<color key="barTintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<textAttributes key="titleTextAttributes">
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="22"/>
|
||||
<color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</textAttributes>
|
||||
</navigationBar>
|
||||
<connections>
|
||||
<segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="Ihp-Pi-YKS"/>
|
||||
</connections>
|
||||
</navigationController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="Pz7-pW-H47" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="-1092" y="163"/>
|
||||
</scene>
|
||||
<!--Zockerhöhle-->
|
||||
<scene sceneID="tne-QT-ifu">
|
||||
<objects>
|
||||
<viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<viewController id="BYZ-38-t0r" customClass="AllConsolesViewController" customModule="Zockerhoehle" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="85" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="ojl-uD-iv1">
|
||||
<rect key="frame" x="0.0" y="88" width="414" height="774"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<inset key="separatorInset" minX="85" minY="0.0" maxX="0.0" maxY="0.0"/>
|
||||
<prototypes>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="ConsoleCell" rowHeight="85" id="FVv-MH-9pT" customClass="ConsoleCell" customModule="Zockerhoehle" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="28" width="414" height="85"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="FVv-MH-9pT" id="Zkq-Nd-xoz">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="85"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Spiele:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dlI-Zp-y9l">
|
||||
<rect key="frame" x="90" y="47" width="44" height="17"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="eMj-mQ-9P0" userLabel="Logo">
|
||||
<rect key="frame" x="10" y="10" width="65" height="65"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="65" id="HVL-Gb-Ocq"/>
|
||||
<constraint firstAttribute="width" secondItem="eMj-mQ-9P0" secondAttribute="height" multiplier="1:1" id="el0-Ku-UP4"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Console Name" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="STD-i3-2rX">
|
||||
<rect key="frame" x="85" y="21" width="299" height="21"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="21" id="CA0-vs-X0G"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="000" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="i4R-Q2-6HF">
|
||||
<rect key="frame" x="139" y="47" width="26.666666666666657" height="17"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Zubehör:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="NsM-Ms-Klx">
|
||||
<rect key="frame" x="180.66666666666666" y="47" width="59" height="17"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="000" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fzz-MZ-0M5">
|
||||
<rect key="frame" x="244.66666666666663" y="47" width="27" height="17"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="i4R-Q2-6HF" firstAttribute="top" secondItem="STD-i3-2rX" secondAttribute="bottom" constant="5" id="3pv-pP-mhy"/>
|
||||
<constraint firstItem="dlI-Zp-y9l" firstAttribute="leading" secondItem="eMj-mQ-9P0" secondAttribute="trailing" constant="15" id="4KG-Jh-XuH"/>
|
||||
<constraint firstItem="STD-i3-2rX" firstAttribute="top" secondItem="Zkq-Nd-xoz" secondAttribute="topMargin" constant="10" id="7tq-uG-aeE"/>
|
||||
<constraint firstItem="dlI-Zp-y9l" firstAttribute="top" secondItem="STD-i3-2rX" secondAttribute="bottom" constant="5" id="AZK-kq-31V"/>
|
||||
<constraint firstItem="NsM-Ms-Klx" firstAttribute="leading" secondItem="i4R-Q2-6HF" secondAttribute="trailing" constant="15" id="CCQ-BH-DPJ"/>
|
||||
<constraint firstItem="eMj-mQ-9P0" firstAttribute="leading" secondItem="Zkq-Nd-xoz" secondAttribute="leading" constant="10" id="KyS-fq-R6r"/>
|
||||
<constraint firstItem="NsM-Ms-Klx" firstAttribute="top" secondItem="STD-i3-2rX" secondAttribute="bottom" constant="5" id="MYC-Q0-y23"/>
|
||||
<constraint firstItem="fzz-MZ-0M5" firstAttribute="top" secondItem="STD-i3-2rX" secondAttribute="bottom" constant="5" id="Ngs-Qa-7zD"/>
|
||||
<constraint firstItem="i4R-Q2-6HF" firstAttribute="leading" secondItem="dlI-Zp-y9l" secondAttribute="trailing" constant="5" id="ODU-xE-PYf"/>
|
||||
<constraint firstAttribute="trailingMargin" secondItem="STD-i3-2rX" secondAttribute="trailing" constant="10" id="P3a-GS-BuR"/>
|
||||
<constraint firstItem="STD-i3-2rX" firstAttribute="leading" secondItem="eMj-mQ-9P0" secondAttribute="trailing" constant="10" id="XwS-NH-QPa"/>
|
||||
<constraint firstItem="fzz-MZ-0M5" firstAttribute="leading" secondItem="NsM-Ms-Klx" secondAttribute="trailing" constant="5" id="dya-dr-5Km"/>
|
||||
<constraint firstAttribute="trailingMargin" secondItem="STD-i3-2rX" secondAttribute="trailing" constant="10" id="pjE-zk-oWk"/>
|
||||
<constraint firstItem="eMj-mQ-9P0" firstAttribute="centerY" secondItem="Zkq-Nd-xoz" secondAttribute="centerY" id="sXN-hX-jZc"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<connections>
|
||||
<outlet property="accessoryCounter" destination="fzz-MZ-0M5" id="Dzh-2T-sI9"/>
|
||||
<outlet property="consoleName" destination="STD-i3-2rX" id="63C-WU-8Hh"/>
|
||||
<outlet property="gamesCounter" destination="i4R-Q2-6HF" id="AIt-Wn-fJE"/>
|
||||
<outlet property="logo" destination="eMj-mQ-9P0" id="h3L-8f-kid"/>
|
||||
<segue destination="gOk-ki-5XF" kind="show" identifier="consoleDetail" id="ssy-HC-GiZ"/>
|
||||
</connections>
|
||||
</tableViewCell>
|
||||
</prototypes>
|
||||
<connections>
|
||||
<outlet property="dataSource" destination="BYZ-38-t0r" id="QqD-d8-vAI"/>
|
||||
<outlet property="delegate" destination="BYZ-38-t0r" id="gsr-Bl-Ebo"/>
|
||||
</connections>
|
||||
</tableView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="6Tk-OE-BBY" firstAttribute="bottom" secondItem="ojl-uD-iv1" secondAttribute="bottom" id="JO3-PD-jGZ"/>
|
||||
<constraint firstItem="ojl-uD-iv1" firstAttribute="leading" secondItem="6Tk-OE-BBY" secondAttribute="leading" id="Vcb-ON-mSz"/>
|
||||
<constraint firstItem="ojl-uD-iv1" firstAttribute="leading" secondItem="6Tk-OE-BBY" secondAttribute="leading" id="dps-4t-5VN"/>
|
||||
<constraint firstItem="6Tk-OE-BBY" firstAttribute="trailing" secondItem="ojl-uD-iv1" secondAttribute="trailing" id="iCg-WW-ZQV"/>
|
||||
<constraint firstItem="ojl-uD-iv1" firstAttribute="top" secondItem="6Tk-OE-BBY" secondAttribute="top" id="j8X-ho-vnX"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
|
||||
</view>
|
||||
<navigationItem key="navigationItem" title="Zockerhöhle" id="7cj-pi-m0v">
|
||||
<barButtonItem key="backBarButtonItem" title="Zurück" id="Wxp-Xh-2jj"/>
|
||||
</navigationItem>
|
||||
<connections>
|
||||
<outlet property="consolesTable" destination="ojl-uD-iv1" id="K0F-wm-xOb"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="-95.200000000000003" y="162.5615763546798"/>
|
||||
</scene>
|
||||
<!--Console Items-->
|
||||
<scene sceneID="vbP-hc-pyH">
|
||||
<objects>
|
||||
<viewController title="Console Items" id="gOk-ki-5XF" customClass="ConsoleLibraryViewController" customModule="Zockerhoehle" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="XKz-4W-Isc">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="t1f-CJ-SKt">
|
||||
<rect key="frame" x="30" y="98" width="354" height="32"/>
|
||||
<segments>
|
||||
<segment title="Spiele"/>
|
||||
<segment title="Zubehör"/>
|
||||
</segments>
|
||||
<connections>
|
||||
<action selector="categoryChanged:" destination="gOk-ki-5XF" eventType="valueChanged" id="JTZ-YE-S5B"/>
|
||||
</connections>
|
||||
</segmentedControl>
|
||||
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="QOr-lL-yeW">
|
||||
<rect key="frame" x="0.0" y="139" width="414" height="723"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<prototypes>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="accessoryCell" rowHeight="45" id="t0G-BL-TO2" userLabel="accessoryCell" customClass="AccessoryCell" customModule="Zockerhoehle" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="28" width="414" height="45"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="t0G-BL-TO2" id="bT2-Up-bHY">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="45"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cOg-Ch-Cfq">
|
||||
<rect key="frame" x="30" y="12" width="42" height="21"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="cOg-Ch-Cfq" firstAttribute="leading" secondItem="bT2-Up-bHY" secondAttribute="leadingMargin" constant="10" id="2g8-b9-vYA"/>
|
||||
<constraint firstItem="cOg-Ch-Cfq" firstAttribute="centerY" secondItem="bT2-Up-bHY" secondAttribute="centerY" id="u3M-me-ktM"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<connections>
|
||||
<outlet property="name" destination="cOg-Ch-Cfq" id="abW-oI-ch4"/>
|
||||
<segue destination="DhC-ew-LGX" kind="show" identifier="detail" id="hyu-Ix-aMF"/>
|
||||
</connections>
|
||||
</tableViewCell>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="gameCell" rowHeight="45" id="0ov-Of-xpv" customClass="GameCell" customModule="Zockerhoehle" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="73" width="414" height="45"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="0ov-Of-xpv" id="DVN-x2-m1a">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="45"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EWt-cW-f13">
|
||||
<rect key="frame" x="30" y="12" width="42" height="21"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="EWt-cW-f13" firstAttribute="centerY" secondItem="DVN-x2-m1a" secondAttribute="centerY" id="Hzt-sS-wGt"/>
|
||||
<constraint firstItem="EWt-cW-f13" firstAttribute="leading" secondItem="DVN-x2-m1a" secondAttribute="leadingMargin" constant="10" id="pyi-a4-L6A"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<connections>
|
||||
<outlet property="name" destination="EWt-cW-f13" id="Wa1-ub-jo8"/>
|
||||
<segue destination="R5k-Vz-d3r" kind="show" identifier="detail" id="2UE-J1-N26"/>
|
||||
</connections>
|
||||
</tableViewCell>
|
||||
</prototypes>
|
||||
<connections>
|
||||
<outlet property="dataSource" destination="gOk-ki-5XF" id="Bf8-Tt-5A2"/>
|
||||
<outlet property="delegate" destination="gOk-ki-5XF" id="zVT-fL-Jbg"/>
|
||||
</connections>
|
||||
</tableView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="t1f-CJ-SKt" firstAttribute="leading" secondItem="tx5-Cg-Hdq" secondAttribute="leading" constant="30" id="9bE-CV-3KL"/>
|
||||
<constraint firstItem="t1f-CJ-SKt" firstAttribute="top" secondItem="tx5-Cg-Hdq" secondAttribute="top" constant="10" id="Cek-Dp-yZF"/>
|
||||
<constraint firstItem="t1f-CJ-SKt" firstAttribute="centerX" secondItem="XKz-4W-Isc" secondAttribute="centerX" id="ClK-Zu-eny"/>
|
||||
<constraint firstItem="QOr-lL-yeW" firstAttribute="top" secondItem="t1f-CJ-SKt" secondAttribute="bottom" constant="10" id="Jkd-Ee-Hlf"/>
|
||||
<constraint firstItem="QOr-lL-yeW" firstAttribute="leading" secondItem="tx5-Cg-Hdq" secondAttribute="leading" id="jy3-Jx-Olj"/>
|
||||
<constraint firstItem="tx5-Cg-Hdq" firstAttribute="trailing" secondItem="QOr-lL-yeW" secondAttribute="trailing" id="kg0-DP-lj0"/>
|
||||
<constraint firstItem="tx5-Cg-Hdq" firstAttribute="trailing" secondItem="t1f-CJ-SKt" secondAttribute="trailing" constant="30" id="nPl-Po-059"/>
|
||||
<constraint firstItem="tx5-Cg-Hdq" firstAttribute="bottom" secondItem="QOr-lL-yeW" secondAttribute="bottom" id="zFh-kG-FKA"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="tx5-Cg-Hdq"/>
|
||||
</view>
|
||||
<navigationItem key="navigationItem" title="ConsoleItems" id="cjW-0L-Q8w">
|
||||
<rightBarButtonItems>
|
||||
<barButtonItem systemItem="organize" id="3Mh-Er-qnk">
|
||||
<connections>
|
||||
<action selector="toggleWishlist:" destination="gOk-ki-5XF" id="S2Q-tK-h9b"/>
|
||||
</connections>
|
||||
</barButtonItem>
|
||||
<barButtonItem systemItem="compose" id="apo-qe-Xtq">
|
||||
<connections>
|
||||
<segue destination="mMA-rS-Z54" kind="presentation" identifier="consoleEntryAdd" id="R0Q-dU-JyP"/>
|
||||
</connections>
|
||||
</barButtonItem>
|
||||
</rightBarButtonItems>
|
||||
</navigationItem>
|
||||
<connections>
|
||||
<outlet property="category" destination="t1f-CJ-SKt" id="AFA-Xz-9Ms"/>
|
||||
<outlet property="consoleItemTable" destination="QOr-lL-yeW" id="v0o-EK-Gnd"/>
|
||||
<outlet property="toggleWishList" destination="3Mh-Er-qnk" id="jf6-tk-BxW"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="VXK-q6-aSh" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="581" y="162"/>
|
||||
</scene>
|
||||
<!--Add Entry Pop Up View Controller-->
|
||||
<scene sceneID="Zw3-Mn-1MA">
|
||||
<objects>
|
||||
<viewController modalPresentationStyle="overCurrentContext" id="mMA-rS-Z54" customClass="AddEntryPopUpViewController" customModule="Zockerhoehle" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="3Wo-AD-tai">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="TTj-dw-Xk5" customClass="UIViewX" customModule="Zockerhoehle" customModuleProvider="target">
|
||||
<rect key="frame" x="20" y="94" width="374" height="165"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="headTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="tE2-hr-JfW" customClass="UIButtonX" customModule="Zockerhoehle" customModuleProvider="target">
|
||||
<rect key="frame" x="284" y="125" width="80" height="30"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="80" id="etr-ZW-p0W"/>
|
||||
</constraints>
|
||||
<state key="normal" title="Rein da!"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
|
||||
<real key="value" value="1"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="8"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
|
||||
<color key="value" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="add:" destination="mMA-rS-Z54" eventType="touchUpInside" id="znn-MF-sWk"/>
|
||||
<action selector="nameChanged:" destination="mMA-rS-Z54" eventType="editingChanged" id="ITW-2N-h1I"/>
|
||||
</connections>
|
||||
</button>
|
||||
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Name" textAlignment="justified" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="z4u-nB-SLu">
|
||||
<rect key="frame" x="10" y="85" width="354" height="30"/>
|
||||
<nil key="textColor"/>
|
||||
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
|
||||
<textInputTraits key="textInputTraits"/>
|
||||
<connections>
|
||||
<action selector="nameChanged:" destination="mMA-rS-Z54" eventType="editingChanged" id="N0D-F2-Ejg"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="7Re-uZ-JmH">
|
||||
<rect key="frame" x="10" y="44" width="279" height="32"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<segments>
|
||||
<segment title="Spiel"/>
|
||||
<segment title="Zubehör"/>
|
||||
</segments>
|
||||
<color key="tintColor" red="0.0" green="0.47396980259999999" blue="1" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
|
||||
</segmentedControl>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pY1-Ze-9Au">
|
||||
<rect key="frame" x="10" y="10" width="185" height="22"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="185" id="xXk-YR-Whx"/>
|
||||
</constraints>
|
||||
<attributedString key="attributedText">
|
||||
<fragment content="Trage etwas in die Zockerhöhle!">
|
||||
<attributes>
|
||||
<color key="NSColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<font key="NSFont" size="18" name="Futura-CondensedMedium"/>
|
||||
<paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
|
||||
</attributes>
|
||||
</fragment>
|
||||
</attributedString>
|
||||
<nil key="highlightedColor"/>
|
||||
<size key="shadowOffset" width="3" height="3"/>
|
||||
</label>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="xaq-UB-QTY">
|
||||
<rect key="frame" x="299" y="10" width="65" height="65"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="65" id="6C4-nz-g8c"/>
|
||||
<constraint firstAttribute="height" constant="65" id="fcH-H1-oiw"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qie-gc-pdo" customClass="UIButtonX" customModule="Zockerhoehle" customModuleProvider="target">
|
||||
<rect key="frame" x="10" y="125" width="80" height="30"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="80" id="gfE-Tz-NZg"/>
|
||||
</constraints>
|
||||
<state key="normal" title="Cancel"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="8"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
|
||||
<real key="value" value="1"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
|
||||
<color key="value" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="cancel:" destination="mMA-rS-Z54" eventType="primaryActionTriggered" id="8bf-ml-hbC"/>
|
||||
</connections>
|
||||
</button>
|
||||
<imageView userInteractionEnabled="NO" alpha="0.59999999999999998" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="star" translatesAutoresizingMaskIntoConstraints="NO" id="psR-V9-0x7">
|
||||
<rect key="frame" x="200" y="5" width="40" height="33"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="40" id="k14-Xf-b9C"/>
|
||||
<constraint firstAttribute="height" constant="33" id="kN9-mM-275"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="z4u-nB-SLu" firstAttribute="top" secondItem="7Re-uZ-JmH" secondAttribute="bottom" constant="10" id="2VH-2w-qsx"/>
|
||||
<constraint firstItem="z4u-nB-SLu" firstAttribute="top" secondItem="xaq-UB-QTY" secondAttribute="bottom" constant="10" id="5jc-dV-GRd"/>
|
||||
<constraint firstAttribute="trailing" secondItem="tE2-hr-JfW" secondAttribute="trailing" constant="10" id="AB9-an-EbF"/>
|
||||
<constraint firstAttribute="bottom" secondItem="qie-gc-pdo" secondAttribute="bottom" constant="10" id="Edc-FO-Bku"/>
|
||||
<constraint firstItem="pY1-Ze-9Au" firstAttribute="top" secondItem="TTj-dw-Xk5" secondAttribute="top" constant="10" id="F48-D7-kgC"/>
|
||||
<constraint firstAttribute="trailing" secondItem="z4u-nB-SLu" secondAttribute="trailing" constant="10" id="FLE-C8-JvN"/>
|
||||
<constraint firstAttribute="height" constant="165" id="IfA-es-FPw"/>
|
||||
<constraint firstAttribute="bottom" secondItem="tE2-hr-JfW" secondAttribute="bottom" constant="10" id="Ilh-0A-Cwp"/>
|
||||
<constraint firstItem="psR-V9-0x7" firstAttribute="top" secondItem="TTj-dw-Xk5" secondAttribute="top" constant="5" id="Iqd-l7-R8Z"/>
|
||||
<constraint firstItem="xaq-UB-QTY" firstAttribute="leading" secondItem="7Re-uZ-JmH" secondAttribute="trailing" constant="10" id="JW1-Hn-s7v"/>
|
||||
<constraint firstItem="qie-gc-pdo" firstAttribute="leading" secondItem="TTj-dw-Xk5" secondAttribute="leading" constant="10" id="Job-QR-d6g"/>
|
||||
<constraint firstItem="7Re-uZ-JmH" firstAttribute="leading" secondItem="TTj-dw-Xk5" secondAttribute="leading" constant="10" id="LNR-Tc-BlQ"/>
|
||||
<constraint firstItem="qie-gc-pdo" firstAttribute="top" secondItem="z4u-nB-SLu" secondAttribute="bottom" constant="10" id="XtQ-v8-W6X"/>
|
||||
<constraint firstItem="psR-V9-0x7" firstAttribute="leading" secondItem="pY1-Ze-9Au" secondAttribute="trailing" constant="5" id="Y92-MK-X04"/>
|
||||
<constraint firstItem="pY1-Ze-9Au" firstAttribute="leading" secondItem="TTj-dw-Xk5" secondAttribute="leading" constant="10" id="cRN-zD-8Sq"/>
|
||||
<constraint firstItem="tE2-hr-JfW" firstAttribute="top" secondItem="z4u-nB-SLu" secondAttribute="bottom" constant="10" id="dYi-b9-2o2"/>
|
||||
<constraint firstItem="xaq-UB-QTY" firstAttribute="top" secondItem="TTj-dw-Xk5" secondAttribute="top" constant="10" id="rzU-h9-bpr"/>
|
||||
<constraint firstAttribute="trailing" secondItem="xaq-UB-QTY" secondAttribute="trailing" constant="10" id="zYN-9z-7eb"/>
|
||||
<constraint firstItem="z4u-nB-SLu" firstAttribute="leading" secondItem="TTj-dw-Xk5" secondAttribute="leading" constant="10" id="znc-1o-97B"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
|
||||
<real key="value" value="0.0"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="8"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.40000000000000002" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="TTj-dw-Xk5" firstAttribute="top" secondItem="5Tt-Gn-m42" secondAttribute="top" constant="50" id="5fW-li-UX5"/>
|
||||
<constraint firstItem="5Tt-Gn-m42" firstAttribute="trailing" secondItem="TTj-dw-Xk5" secondAttribute="trailing" constant="20" id="5i1-wZ-pfj"/>
|
||||
<constraint firstItem="TTj-dw-Xk5" firstAttribute="centerX" secondItem="3Wo-AD-tai" secondAttribute="centerX" id="C3h-2J-LOx"/>
|
||||
<constraint firstItem="TTj-dw-Xk5" firstAttribute="leading" secondItem="5Tt-Gn-m42" secondAttribute="leading" constant="20" id="grj-ah-TAM"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="5Tt-Gn-m42"/>
|
||||
</view>
|
||||
<nil key="simulatedTopBarMetrics"/>
|
||||
<connections>
|
||||
<outlet property="addButton" destination="tE2-hr-JfW" id="0jN-TQ-l8f"/>
|
||||
<outlet property="category" destination="7Re-uZ-JmH" id="SLA-H4-6ql"/>
|
||||
<outlet property="icon" destination="xaq-UB-QTY" id="cUt-FW-MM5"/>
|
||||
<outlet property="name" destination="z4u-nB-SLu" id="lRV-dW-ZpI"/>
|
||||
<outlet property="wishlistIcon" destination="psR-V9-0x7" id="w6S-oo-0ar"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="DA6-P7-KUh" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="1921" y="163"/>
|
||||
</scene>
|
||||
<!--Hosting Controller-->
|
||||
<scene sceneID="0Pa-u4-vNw">
|
||||
<objects>
|
||||
<hostingController id="hrQ-Ux-Noc" sceneMemberID="viewController"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="ydg-F5-jxj" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
||||
<containerView opaque="NO" contentMode="scaleToFill" id="jwd-ES-k7V">
|
||||
<rect key="frame" x="0.0" y="0.0" width="240" height="128"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
</containerView>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="2199" y="-526"/>
|
||||
</scene>
|
||||
<!--Game Detail Controller-->
|
||||
<scene sceneID="HBi-xr-Jcc">
|
||||
<objects>
|
||||
<viewController id="R5k-Vz-d3r" customClass="GameDetailController" customModule="Zockerhoehle" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="HUF-dg-EL5">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<containerView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nBd-hQ-o3p">
|
||||
<rect key="frame" x="0.0" y="88" width="414" height="774"/>
|
||||
<connections>
|
||||
<segue destination="hrQ-Ux-Noc" kind="embed" destinationCreationSelector="embedConsoleDetail:" id="XfG-VE-2Zn"/>
|
||||
</connections>
|
||||
</containerView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
|
||||
<constraints>
|
||||
<constraint firstItem="zpp-do-9SK" firstAttribute="trailing" secondItem="nBd-hQ-o3p" secondAttribute="trailing" id="ArI-nu-YkM"/>
|
||||
<constraint firstItem="zpp-do-9SK" firstAttribute="bottom" secondItem="nBd-hQ-o3p" secondAttribute="bottom" id="OIJ-K5-FfE"/>
|
||||
<constraint firstItem="nBd-hQ-o3p" firstAttribute="top" secondItem="zpp-do-9SK" secondAttribute="top" id="dBQ-l8-Que"/>
|
||||
<constraint firstItem="nBd-hQ-o3p" firstAttribute="leading" secondItem="zpp-do-9SK" secondAttribute="leading" id="mzG-jD-pjx"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="zpp-do-9SK"/>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="8KX-Py-CBC" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="1272" y="-599"/>
|
||||
</scene>
|
||||
<!--Accessory Detail Controller-->
|
||||
<scene sceneID="6M3-J4-bBk">
|
||||
<objects>
|
||||
<viewController id="DhC-ew-LGX" customClass="AccessoryDetailController" customModule="Zockerhoehle" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="05c-6e-wjg">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<containerView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="HaX-Qb-L8E">
|
||||
<rect key="frame" x="0.0" y="88" width="414" height="774"/>
|
||||
<connections>
|
||||
<segue destination="IHD-CO-X7J" kind="embed" destinationCreationSelector="emebdedAccessoryDetaio:" id="o2V-GB-pPU"/>
|
||||
</connections>
|
||||
</containerView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
|
||||
<constraints>
|
||||
<constraint firstItem="HaX-Qb-L8E" firstAttribute="top" secondItem="7GM-UU-HrF" secondAttribute="top" id="1fF-7M-9Rc"/>
|
||||
<constraint firstItem="HaX-Qb-L8E" firstAttribute="leading" secondItem="7GM-UU-HrF" secondAttribute="leading" id="V59-f6-Nxo"/>
|
||||
<constraint firstItem="7GM-UU-HrF" firstAttribute="trailing" secondItem="HaX-Qb-L8E" secondAttribute="trailing" id="vTc-Sl-d6k"/>
|
||||
<constraint firstItem="7GM-UU-HrF" firstAttribute="bottom" secondItem="HaX-Qb-L8E" secondAttribute="bottom" id="xQh-Sq-3BZ"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="7GM-UU-HrF"/>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="DoD-SM-DFW" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="-287" y="-644"/>
|
||||
</scene>
|
||||
<!--Hosting Controller-->
|
||||
<scene sceneID="89e-4g-MS7">
|
||||
<objects>
|
||||
<hostingController id="IHD-CO-X7J" sceneMemberID="viewController"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="NbQ-0I-7vv" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="493" y="-1000"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
<resources>
|
||||
<image name="star" width="512" height="512"/>
|
||||
</resources>
|
||||
<color key="tintColor" white="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</document>
|
||||
|
||||
69
Zockerhoehle/CDManager.swift
Normal file
@@ -0,0 +1,69 @@
|
||||
//
|
||||
// CDManager.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 24.06.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import CoreData
|
||||
|
||||
class CDManager {
|
||||
|
||||
static let shared : CDManager = CDManager();
|
||||
|
||||
private init() {
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Core Data stack
|
||||
|
||||
lazy var persistentContainer: NSPersistentContainer = {
|
||||
/*
|
||||
The persistent container for the application. This implementation
|
||||
creates and returns a container, having loaded the store for the
|
||||
application to it. This property is optional since there are legitimate
|
||||
error conditions that could cause the creation of the store to fail.
|
||||
*/
|
||||
let container = NSPersistentContainer(name: "Zockerhoehle")
|
||||
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
|
||||
if let error = error as NSError? {
|
||||
// Replace this implementation with code to handle the error appropriately.
|
||||
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
|
||||
|
||||
/*
|
||||
Typical reasons for an error here include:
|
||||
* The parent directory does not exist, cannot be created, or disallows writing.
|
||||
* The persistent store is not accessible, due to permissions or data protection when the device is locked.
|
||||
* The device is out of space.
|
||||
* The store could not be migrated to the current model version.
|
||||
Check the error message to determine what the actual problem was.
|
||||
*/
|
||||
fatalError("Unresolved error \(error), \(error.userInfo)")
|
||||
}
|
||||
})
|
||||
return container
|
||||
}()
|
||||
|
||||
lazy var viewContext : NSManagedObjectContext = {
|
||||
self.persistentContainer.viewContext
|
||||
}()
|
||||
|
||||
// MARK: - Core Data Saving support
|
||||
|
||||
func saveContext () {
|
||||
persistentContainer.performBackgroundTask({(context) in
|
||||
if context.hasChanges {
|
||||
do {
|
||||
try context.save()
|
||||
} catch {
|
||||
// Replace this implementation with code to handle the error appropriately.
|
||||
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
|
||||
let nserror = error as NSError
|
||||
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
16
Zockerhoehle/CDModel/Accessory+CoreDataClass.swift
Normal file
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// Accessory+CoreDataClass.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 06.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import CoreData
|
||||
|
||||
@objc(Accessory)
|
||||
public class Accessory: NSManagedObject {
|
||||
|
||||
}
|
||||
26
Zockerhoehle/CDModel/Accessory+CoreDataProperties.swift
Normal file
@@ -0,0 +1,26 @@
|
||||
//
|
||||
// Accessory+CoreDataProperties.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 06.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import CoreData
|
||||
|
||||
|
||||
extension Accessory {
|
||||
|
||||
@nonobjc public class func fetchRequest() -> NSFetchRequest<Accessory> {
|
||||
return NSFetchRequest<Accessory>(entityName: "Accessory")
|
||||
}
|
||||
|
||||
@NSManaged public var color: String?
|
||||
@NSManaged public var manufacturer: String?
|
||||
@NSManaged public var name: String
|
||||
@NSManaged public var inWishlist: Bool
|
||||
@NSManaged public var console: Console?
|
||||
|
||||
}
|
||||
16
Zockerhoehle/CDModel/Console+CoreDataClass.swift
Normal file
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// Console+CoreDataClass.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 06.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import CoreData
|
||||
|
||||
@objc(Console)
|
||||
public class Console: NSManagedObject {
|
||||
|
||||
}
|
||||
61
Zockerhoehle/CDModel/Console+CoreDataProperties.swift
Normal file
@@ -0,0 +1,61 @@
|
||||
//
|
||||
// Console+CoreDataProperties.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 06.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import CoreData
|
||||
|
||||
|
||||
extension Console {
|
||||
|
||||
@nonobjc public class func fetchRequest() -> NSFetchRequest<Console> {
|
||||
return NSFetchRequest<Console>(entityName: "Console")
|
||||
}
|
||||
|
||||
@NSManaged public var generation: Int64
|
||||
@NSManaged public var manufacturer: String?
|
||||
@NSManaged public var name: String?
|
||||
@NSManaged public var accessories: NSSet
|
||||
@NSManaged public var games: NSSet
|
||||
@NSManaged public var logo: Logo?
|
||||
|
||||
}
|
||||
|
||||
// MARK: Generated accessors for accessories
|
||||
extension Console {
|
||||
|
||||
@objc(addAccessoriesObject:)
|
||||
@NSManaged public func addToAccessories(_ value: Accessory)
|
||||
|
||||
@objc(removeAccessoriesObject:)
|
||||
@NSManaged public func removeFromAccessories(_ value: Accessory)
|
||||
|
||||
@objc(addAccessories:)
|
||||
@NSManaged public func addToAccessories(_ values: NSSet)
|
||||
|
||||
@objc(removeAccessories:)
|
||||
@NSManaged public func removeFromAccessories(_ values: NSSet)
|
||||
|
||||
}
|
||||
|
||||
// MARK: Generated accessors for games
|
||||
extension Console {
|
||||
|
||||
@objc(addGamesObject:)
|
||||
@NSManaged public func addToGames(_ value: Game)
|
||||
|
||||
@objc(removeGamesObject:)
|
||||
@NSManaged public func removeFromGames(_ value: Game)
|
||||
|
||||
@objc(addGames:)
|
||||
@NSManaged public func addToGames(_ values: NSSet)
|
||||
|
||||
@objc(removeGames:)
|
||||
@NSManaged public func removeFromGames(_ values: NSSet)
|
||||
|
||||
}
|
||||
16
Zockerhoehle/CDModel/Cover+CoreDataClass.swift
Normal file
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// Cover+CoreDataClass.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 06.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import CoreData
|
||||
|
||||
@objc(Cover)
|
||||
public class Cover: NSManagedObject {
|
||||
|
||||
}
|
||||
23
Zockerhoehle/CDModel/Cover+CoreDataProperties.swift
Normal file
@@ -0,0 +1,23 @@
|
||||
//
|
||||
// Cover+CoreDataProperties.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 06.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import CoreData
|
||||
import UIKit.UIImage
|
||||
|
||||
extension Cover {
|
||||
|
||||
@nonobjc public class func fetchRequest() -> NSFetchRequest<Cover> {
|
||||
return NSFetchRequest<Cover>(entityName: "Cover")
|
||||
}
|
||||
|
||||
@NSManaged public var image: UIImage?
|
||||
@NSManaged public var game: Game?
|
||||
|
||||
}
|
||||
16
Zockerhoehle/CDModel/Game+CoreDataClass.swift
Normal file
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// Game+CoreDataClass.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 06.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import CoreData
|
||||
|
||||
@objc(Game)
|
||||
public class Game: NSManagedObject {
|
||||
|
||||
}
|
||||
30
Zockerhoehle/CDModel/Game+CoreDataProperties.swift
Normal file
@@ -0,0 +1,30 @@
|
||||
//
|
||||
// Game+CoreDataProperties.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 06.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import CoreData
|
||||
|
||||
|
||||
extension Game {
|
||||
|
||||
@nonobjc public class func fetchRequest() -> NSFetchRequest<Game> {
|
||||
return NSFetchRequest<Game>(entityName: "Game")
|
||||
}
|
||||
|
||||
@NSManaged public var finished: Date?
|
||||
@NSManaged public var inWishlist: Bool
|
||||
@NSManaged public var isDigital: Bool
|
||||
@NSManaged public var name: String
|
||||
@NSManaged public var notes: String?
|
||||
@NSManaged public var publisher: String?
|
||||
@NSManaged public var console: Console?
|
||||
@NSManaged public var series: GameSeries?
|
||||
@NSManaged public var cover: Cover?
|
||||
|
||||
}
|
||||
16
Zockerhoehle/CDModel/GameSeries+CoreDataClass.swift
Normal file
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// GameSeries+CoreDataClass.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 06.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import CoreData
|
||||
|
||||
@objc(GameSeries)
|
||||
public class GameSeries: NSManagedObject {
|
||||
|
||||
}
|
||||
41
Zockerhoehle/CDModel/GameSeries+CoreDataProperties.swift
Normal file
@@ -0,0 +1,41 @@
|
||||
//
|
||||
// GameSeries+CoreDataProperties.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 06.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import CoreData
|
||||
|
||||
|
||||
extension GameSeries {
|
||||
|
||||
@nonobjc public class func fetchRequest() -> NSFetchRequest<GameSeries> {
|
||||
return NSFetchRequest<GameSeries>(entityName: "GameSeries")
|
||||
}
|
||||
|
||||
@NSManaged public var cover: Data?
|
||||
@NSManaged public var name: String?
|
||||
@NSManaged public var games: NSSet
|
||||
|
||||
}
|
||||
|
||||
// MARK: Generated accessors for games
|
||||
extension GameSeries {
|
||||
|
||||
@objc(addGamesObject:)
|
||||
@NSManaged public func addToGames(_ value: Game)
|
||||
|
||||
@objc(removeGamesObject:)
|
||||
@NSManaged public func removeFromGames(_ value: Game)
|
||||
|
||||
@objc(addGames:)
|
||||
@NSManaged public func addToGames(_ values: NSSet)
|
||||
|
||||
@objc(removeGames:)
|
||||
@NSManaged public func removeFromGames(_ values: NSSet)
|
||||
|
||||
}
|
||||
16
Zockerhoehle/CDModel/Logo+CoreDataClass.swift
Normal file
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// Logo+CoreDataClass.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 06.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import CoreData
|
||||
|
||||
@objc(Logo)
|
||||
public class Logo: NSManagedObject {
|
||||
|
||||
}
|
||||
23
Zockerhoehle/CDModel/Logo+CoreDataProperties.swift
Normal file
@@ -0,0 +1,23 @@
|
||||
//
|
||||
// Logo+CoreDataProperties.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 06.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import CoreData
|
||||
import UIKit.UIImage
|
||||
|
||||
extension Logo {
|
||||
|
||||
@nonobjc public class func fetchRequest() -> NSFetchRequest<Logo> {
|
||||
return NSFetchRequest<Logo>(entityName: "Logo")
|
||||
}
|
||||
|
||||
@NSManaged public var image: UIImage?
|
||||
@NSManaged public var console: Console?
|
||||
|
||||
}
|
||||
@@ -4,6 +4,8 @@
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>Zockerhöhle</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
@@ -20,6 +22,11 @@
|
||||
<string>1</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
<dict>
|
||||
<key>NSAllowsArbitraryLoads</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
|
||||
43
Zockerhoehle/LaunchScreen.storyboard
Normal file
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14313.18" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||
<device id="retina5_9" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14283.14"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--View Controller-->
|
||||
<scene sceneID="EHf-IW-A2E">
|
||||
<objects>
|
||||
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="812"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="LaunchScreen" translatesAutoresizingMaskIntoConstraints="NO" id="195-Py-CeW">
|
||||
<rect key="frame" x="0.0" y="44" width="375" height="734"/>
|
||||
</imageView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="Bcu-3y-fUS" firstAttribute="trailing" secondItem="195-Py-CeW" secondAttribute="trailing" id="GAy-kq-ynB"/>
|
||||
<constraint firstItem="Bcu-3y-fUS" firstAttribute="bottom" secondItem="195-Py-CeW" secondAttribute="bottom" id="LhS-h3-Zza"/>
|
||||
<constraint firstItem="195-Py-CeW" firstAttribute="top" secondItem="Bcu-3y-fUS" secondAttribute="top" id="e5I-ug-myU"/>
|
||||
<constraint firstItem="195-Py-CeW" firstAttribute="leading" secondItem="Bcu-3y-fUS" secondAttribute="leading" id="efz-kk-ThH"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="Bcu-3y-fUS"/>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="53" y="375"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
<resources>
|
||||
<image name="LaunchScreen" width="1125" height="2436"/>
|
||||
</resources>
|
||||
</document>
|
||||
111
Zockerhoehle/Lib/CodableExtensionAny.swift
Normal file
@@ -0,0 +1,111 @@
|
||||
//
|
||||
// Ext.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 17.09.18.
|
||||
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
// Inspired by https://gist.github.com/mbuchetics/c9bc6c22033014aa0c550d3b4324411a
|
||||
|
||||
struct JSONCodingKeys: CodingKey {
|
||||
var stringValue: String
|
||||
|
||||
init?(stringValue: String) {
|
||||
self.stringValue = stringValue
|
||||
}
|
||||
|
||||
var intValue: Int?
|
||||
|
||||
init?(intValue: Int) {
|
||||
self.init(stringValue: "\(intValue)")
|
||||
self.intValue = intValue
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
extension KeyedDecodingContainer {
|
||||
|
||||
func decode(_ type: Dictionary<String, Any>.Type, forKey key: K) throws -> Dictionary<String, Any> {
|
||||
let container = try self.nestedContainer(keyedBy: JSONCodingKeys.self, forKey: key)
|
||||
return try container.decode(type)
|
||||
}
|
||||
|
||||
func decodeIfPresent(_ type: Dictionary<String, Any>.Type, forKey key: K) throws -> Dictionary<String, Any>? {
|
||||
guard contains(key) else {
|
||||
return nil
|
||||
}
|
||||
guard try decodeNil(forKey: key) == false else {
|
||||
return nil
|
||||
}
|
||||
return try decode(type, forKey: key)
|
||||
}
|
||||
|
||||
func decode(_ type: Array<Any>.Type, forKey key: K) throws -> Array<Any> {
|
||||
var container = try self.nestedUnkeyedContainer(forKey: key)
|
||||
return try container.decode(type)
|
||||
}
|
||||
|
||||
func decodeIfPresent(_ type: Array<Any>.Type, forKey key: K) throws -> Array<Any>? {
|
||||
guard contains(key) else {
|
||||
return nil
|
||||
}
|
||||
guard try decodeNil(forKey: key) == false else {
|
||||
return nil
|
||||
}
|
||||
return try decode(type, forKey: key)
|
||||
}
|
||||
|
||||
func decode(_ type: Dictionary<String, Any>.Type) throws -> Dictionary<String, Any> {
|
||||
var dictionary = Dictionary<String, Any>()
|
||||
|
||||
for key in allKeys {
|
||||
if let boolValue = try? decode(Bool.self, forKey: key) {
|
||||
dictionary[key.stringValue] = boolValue
|
||||
} else if let stringValue = try? decode(String.self, forKey: key) {
|
||||
dictionary[key.stringValue] = stringValue
|
||||
} else if let intValue = try? decode(Int.self, forKey: key) {
|
||||
dictionary[key.stringValue] = intValue
|
||||
} else if let doubleValue = try? decode(Double.self, forKey: key) {
|
||||
dictionary[key.stringValue] = doubleValue
|
||||
} else if let nestedDictionary = try? decode(Dictionary<String, Any>.self, forKey: key) {
|
||||
dictionary[key.stringValue] = nestedDictionary
|
||||
} else if let nestedArray = try? decode(Array<Any>.self, forKey: key) {
|
||||
dictionary[key.stringValue] = nestedArray
|
||||
}
|
||||
}
|
||||
return dictionary
|
||||
}
|
||||
}
|
||||
|
||||
extension UnkeyedDecodingContainer {
|
||||
|
||||
mutating func decode(_ type: Array<Any>.Type) throws -> Array<Any> {
|
||||
var array: [Any] = []
|
||||
while isAtEnd == false {
|
||||
// See if the current value in the JSON array is `null` first and prevent infite recursion with nested arrays.
|
||||
if try decodeNil() {
|
||||
continue
|
||||
} else if let value = try? decode(Bool.self) {
|
||||
array.append(value)
|
||||
} else if let value = try? decode(Double.self) {
|
||||
array.append(value)
|
||||
} else if let value = try? decode(String.self) {
|
||||
array.append(value)
|
||||
} else if let nestedDictionary = try? decode(Dictionary<String, Any>.self) {
|
||||
array.append(nestedDictionary)
|
||||
} else if let nestedArray = try? decode(Array<Any>.self) {
|
||||
array.append(nestedArray)
|
||||
}
|
||||
}
|
||||
return array
|
||||
}
|
||||
|
||||
mutating func decode(_ type: Dictionary<String, Any>.Type) throws -> Dictionary<String, Any> {
|
||||
|
||||
let nestedContainer = try self.nestedContainer(keyedBy: JSONCodingKeys.self)
|
||||
return try nestedContainer.decode(type)
|
||||
}
|
||||
}
|
||||
43
Zockerhoehle/Lib/UIButtonX.swift
Normal file
@@ -0,0 +1,43 @@
|
||||
//
|
||||
// UIButtonStoryBoardExtenstion.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 22.09.18.
|
||||
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import Foundation
|
||||
|
||||
@IBDesignable class UIButtonX : UIButton {
|
||||
|
||||
@IBInspectable var borderWidth: CGFloat {
|
||||
set {
|
||||
layer.borderWidth = newValue
|
||||
}
|
||||
get {
|
||||
return layer.borderWidth
|
||||
}
|
||||
}
|
||||
|
||||
@IBInspectable var cornerRadius: CGFloat {
|
||||
set {
|
||||
layer.cornerRadius = newValue
|
||||
}
|
||||
get {
|
||||
return layer.cornerRadius
|
||||
}
|
||||
}
|
||||
|
||||
@IBInspectable var borderColor: UIColor? {
|
||||
set {
|
||||
guard let uiColor = newValue else { return }
|
||||
layer.borderColor = uiColor.cgColor
|
||||
}
|
||||
get {
|
||||
guard let color = layer.borderColor else { return nil }
|
||||
return UIColor(cgColor: color)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
53
Zockerhoehle/Lib/UIViewX.swift
Normal file
@@ -0,0 +1,53 @@
|
||||
//
|
||||
// UIViewX.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 22.09.18.
|
||||
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
//
|
||||
// UIButtonStoryBoardExtenstion.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 22.09.18.
|
||||
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import Foundation
|
||||
|
||||
@IBDesignable class UIViewX : UIView {
|
||||
|
||||
@IBInspectable var borderWidth: CGFloat {
|
||||
set {
|
||||
layer.borderWidth = newValue
|
||||
}
|
||||
get {
|
||||
return layer.borderWidth
|
||||
}
|
||||
}
|
||||
|
||||
@IBInspectable var cornerRadius: CGFloat {
|
||||
set {
|
||||
layer.cornerRadius = newValue
|
||||
}
|
||||
get {
|
||||
return layer.cornerRadius
|
||||
}
|
||||
}
|
||||
|
||||
@IBInspectable var borderColor: UIColor? {
|
||||
set {
|
||||
guard let uiColor = newValue else { return }
|
||||
layer.borderColor = uiColor.cgColor
|
||||
}
|
||||
get {
|
||||
guard let color = layer.borderColor else { return nil }
|
||||
return UIColor(cgColor: color)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
31
Zockerhoehle/Model/Attachment.swift
Normal file
@@ -0,0 +1,31 @@
|
||||
//
|
||||
// Attachment.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 14.09.18.
|
||||
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
typealias AttachmentID = String
|
||||
|
||||
struct Attachment : Codable {
|
||||
var id : AttachmentID
|
||||
var type : String
|
||||
var file : Data?
|
||||
var isDeleted : Bool
|
||||
var description : String
|
||||
var createdOn : String
|
||||
var changedOn : String
|
||||
|
||||
enum CodingKeys : String, CodingKey {
|
||||
case id = "_id"
|
||||
case type
|
||||
case file
|
||||
case isDeleted
|
||||
case description
|
||||
case createdOn = "created"
|
||||
case changedOn = "changed"
|
||||
}
|
||||
}
|
||||
44
Zockerhoehle/Model/ConsoleEntry.swift
Normal file
@@ -0,0 +1,44 @@
|
||||
//
|
||||
// ConsoleEntry.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 17.09.18.
|
||||
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
class ConsoleEntry : FlockeEntry {
|
||||
var generation : Int? {
|
||||
get {
|
||||
return self.content["Generation"] as? Int
|
||||
}
|
||||
}
|
||||
|
||||
var manufacturer : String? {
|
||||
get {
|
||||
return self.content["Manufacturer"] as? String
|
||||
}
|
||||
}
|
||||
|
||||
override init(entry: FlockeEntry) {
|
||||
super.init(entry: entry)
|
||||
}
|
||||
|
||||
required init(from decoder: Decoder) throws {
|
||||
try super.init(from: decoder)
|
||||
}
|
||||
|
||||
override func encodeContent(to encoder: Encoder) throws {
|
||||
var container = encoder.container(keyedBy: CodingKeys.self)
|
||||
|
||||
var contentContainer = container.nestedContainer(keyedBy: CodingKeysContentConsoleEntry.self, forKey: CodingKeys.content)
|
||||
try contentContainer.encode(self.generation, forKey: CodingKeysContentConsoleEntry.Generation)
|
||||
try contentContainer.encode(self.manufacturer, forKey: CodingKeysContentConsoleEntry.Manufacturer)
|
||||
}
|
||||
|
||||
enum CodingKeysContentConsoleEntry : String, CodingKey {
|
||||
case Generation = "Generation"
|
||||
case Manufacturer
|
||||
}
|
||||
}
|
||||
103
Zockerhoehle/Model/FlockeEntry.swift
Normal file
@@ -0,0 +1,103 @@
|
||||
//
|
||||
// Console.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 12.09.18.
|
||||
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
typealias FlockeEntryID = String
|
||||
|
||||
class FlockeEntry : Codable {
|
||||
let id : FlockeEntryID
|
||||
let isDeleted : Bool
|
||||
let name : String
|
||||
let createdOn : String
|
||||
let changedOn : String
|
||||
let content : [String : Any]
|
||||
var iconAttachment : Attachment?
|
||||
var parents : [FlockeEntryID]
|
||||
|
||||
init (entry : FlockeEntry) {
|
||||
self.id = entry.id
|
||||
self.isDeleted = entry.isDeleted
|
||||
self.name = entry.name
|
||||
self.createdOn = entry.createdOn
|
||||
self.changedOn = entry.changedOn
|
||||
self.content = entry.content
|
||||
self.iconAttachment = entry.iconAttachment
|
||||
self.parents = entry.parents
|
||||
}
|
||||
|
||||
required init(from decoder: Decoder) throws {
|
||||
let container = try decoder.container(keyedBy: CodingKeys.self)
|
||||
|
||||
id = try container.decode(String.self, forKey: .id)
|
||||
isDeleted = try container.decode(Bool.self, forKey: .isDeleted)
|
||||
name = try container.decode(String.self, forKey: .name)
|
||||
createdOn = try container.decode(String.self, forKey: .createdOn)
|
||||
changedOn = try container.decode(String.self, forKey: .changedOn)
|
||||
|
||||
parents = try container.decode([FlockeEntryID].self, forKey: .parents)
|
||||
|
||||
do {
|
||||
content = try container.decode([String : Any].self, forKey: .content)
|
||||
}catch{
|
||||
content = [:]
|
||||
}
|
||||
|
||||
do {
|
||||
let attachmentContainer = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .attachments)
|
||||
|
||||
iconAttachment = try? attachmentContainer.decode(Attachment.self, forKey: .icon)
|
||||
}catch {
|
||||
iconAttachment = nil
|
||||
}
|
||||
}
|
||||
|
||||
func encode(to encoder: Encoder) throws {
|
||||
var container = encoder.container(keyedBy: CodingKeys.self)
|
||||
|
||||
try container.encode(self.id, forKey: .id)
|
||||
try container.encode(self.isDeleted, forKey: .isDeleted)
|
||||
try container.encode(self.name, forKey: .name)
|
||||
try container.encode(self.createdOn, forKey: .createdOn)
|
||||
try container.encode(self.changedOn, forKey: .changedOn)
|
||||
|
||||
try container.encode(self.parents, forKey: .parents)
|
||||
|
||||
var attachmentContainer = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .attachments)
|
||||
|
||||
try attachmentContainer.encode(self.iconAttachment, forKey: .icon)
|
||||
|
||||
if (!self.content.isEmpty) {
|
||||
try encodeContent(to: encoder);
|
||||
}
|
||||
}
|
||||
|
||||
func encodeContent(to encoder: Encoder) throws {}
|
||||
|
||||
enum CodingKeys : String, CodingKey {
|
||||
case id = "_id"
|
||||
case isDeleted
|
||||
case name = "name"
|
||||
case createdOn = "created"
|
||||
case changedOn = "changed"
|
||||
case content
|
||||
case manufacturer = "Manufacturer"
|
||||
case generation = "Generation"
|
||||
case attachments
|
||||
case icon
|
||||
case parents
|
||||
}
|
||||
}
|
||||
|
||||
extension FlockeEntry: Equatable {
|
||||
static func == (lhs: FlockeEntry, rhs: FlockeEntry) -> Bool {
|
||||
return lhs.id == rhs.id
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
185
Zockerhoehle/Model/GameCollection.swift
Normal file
@@ -0,0 +1,185 @@
|
||||
//
|
||||
// Consoles.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 13.09.18.
|
||||
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Disk
|
||||
import CoreData
|
||||
|
||||
protocol ConsoleItemObserver {
|
||||
func consoleItemDataUpdate(for parent : FlockeEntryID)
|
||||
}
|
||||
|
||||
protocol AttachmentObserver {
|
||||
func attachmentUpdate(attachmentID : AttachmentID)
|
||||
}
|
||||
|
||||
class GameCollection {
|
||||
static let shared : GameCollection = GameCollection()
|
||||
|
||||
//TODO: Zusammenfuehren von consoles und consoleItemsByParent
|
||||
var consoles : [ConsoleEntry] = []
|
||||
var consoleItemsByParent : [FlockeEntryID : [FlockeEntry]] = [:]
|
||||
var attachments : [AttachmentID : Attachment] = [:]
|
||||
|
||||
private var consoleItemObservers : [ConsoleItemObserver] = []
|
||||
private var attachmentObservers : [AttachmentObserver] = []
|
||||
|
||||
init() {
|
||||
do {
|
||||
self.consoles = try Disk.retrieve("consoles.json", from: .caches, as: [ConsoleEntry].self)
|
||||
self.consoleItemsByParent = try Disk.retrieve("consoleItems.json", from: .caches, as: [FlockeEntryID : [FlockeEntry]].self)
|
||||
self.attachments = try Disk.retrieve("attachments.json", from: .caches, as: [AttachmentID : Attachment].self)
|
||||
|
||||
//Fill core data on Startup
|
||||
|
||||
print("Game Collection import begin");
|
||||
|
||||
let cdm = CDManager.shared
|
||||
|
||||
for console in self.consoles {
|
||||
let cdConsole = Console(entity: Console.entity(), insertInto: cdm.viewContext)
|
||||
cdConsole.name = console.name
|
||||
|
||||
cdConsole.generation = Int64(console.generation ?? 0)
|
||||
cdConsole.manufacturer = console.manufacturer
|
||||
|
||||
guard let consoleItems = self.consoleItemsByParent[console.id] else {
|
||||
print("No games: \(console.name)")
|
||||
continue
|
||||
}
|
||||
|
||||
if let imgID = console.iconAttachment?.id , let img = self.attachments[imgID]?.file {
|
||||
let cdLogo = Logo(entity: Logo.entity(), insertInto: cdm.viewContext)
|
||||
cdLogo.image = UIImage(data: img)
|
||||
cdConsole.logo = cdLogo
|
||||
}
|
||||
|
||||
for item in consoleItems {
|
||||
if (item.parents.contains(GameCollection.accessoryID)) {
|
||||
let cdAccessory = Accessory(entity: Accessory.entity(), insertInto: cdm.viewContext)
|
||||
|
||||
cdAccessory.name = item.name
|
||||
cdAccessory.inWishlist = item.parents.contains(GameCollection.wishlistID)
|
||||
cdConsole.addToAccessories(cdAccessory)
|
||||
|
||||
}else if (item.parents.contains(GameCollection.videogameID)) {
|
||||
let cdGame = Game(entity: Game.entity(), insertInto: cdm.viewContext)
|
||||
|
||||
cdGame.name = item.name
|
||||
cdGame.inWishlist = item.parents.contains(GameCollection.wishlistID)
|
||||
|
||||
cdConsole.addToGames(cdGame)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}catch let error as NSError {
|
||||
print("Load of Chached not possible \(error.localizedDescription)");
|
||||
}
|
||||
}
|
||||
|
||||
func addFlockeEntryObserver(observer: ConsoleItemObserver) {
|
||||
self.consoleItemObservers.append(observer)
|
||||
}
|
||||
|
||||
func addAttachmentObserver(observer: AttachmentObserver) {
|
||||
self.attachmentObservers.append(observer)
|
||||
}
|
||||
|
||||
fileprivate func notifyConSoleItemObservers(_ parent: FlockeEntryID) {
|
||||
for observer in self.consoleItemObservers {
|
||||
observer.consoleItemDataUpdate(for: parent)
|
||||
}
|
||||
}
|
||||
|
||||
func updateGameItems(items : [FlockeEntry], with parent : FlockeEntryID) {
|
||||
if parent == GameCollection.consoleID {
|
||||
updateConsoles(entrys: items)
|
||||
}else {
|
||||
self.consoleItemsByParent[parent] = items
|
||||
|
||||
do {
|
||||
try Disk.save(self.consoleItemsByParent, to: .caches, as: "consoleItems.json")
|
||||
}catch let error as NSError {
|
||||
print("Write of GameItems not possible \(error.localizedDescription)");
|
||||
}
|
||||
}
|
||||
|
||||
notifyConSoleItemObservers(parent)
|
||||
}
|
||||
|
||||
func remove(from: FlockeEntry, parentID: FlockeEntryID) {
|
||||
from.parents.removeAll(where: {$0 == parentID})
|
||||
|
||||
for parent in from.parents {
|
||||
notifyConSoleItemObservers(parent)
|
||||
}
|
||||
}
|
||||
|
||||
func removeGameItem(from console : FlockeEntry, item: FlockeEntry) {
|
||||
guard let consoleItems : [FlockeEntry] = self.consoleItemsByParent[console.id] else {
|
||||
return
|
||||
}
|
||||
|
||||
if let index = consoleItems.firstIndex(of: item) {
|
||||
consoleItemsByParent[console.id]!.remove(at: index);
|
||||
|
||||
notifyConSoleItemObservers(console.id)
|
||||
}
|
||||
}
|
||||
|
||||
func updateAttachment(attachment : Attachment) {
|
||||
self.attachments[attachment.id] = attachment
|
||||
|
||||
do {
|
||||
try Disk.save(self.attachments, to: .caches, as: "attachments.json")
|
||||
}catch let error as NSError {
|
||||
print("Write of Attachments not possible \(error.localizedDescription)");
|
||||
}
|
||||
|
||||
for observer in self.attachmentObservers {
|
||||
observer.attachmentUpdate(attachmentID: attachment.id)
|
||||
}
|
||||
}
|
||||
|
||||
func updateConsoles(entrys: [FlockeEntry]) {
|
||||
self.consoles = []
|
||||
for entry in entrys {
|
||||
self.consoles.append(ConsoleEntry(entry: entry))
|
||||
}
|
||||
|
||||
//IN-Place Sort
|
||||
self.consoles.sort {
|
||||
//1. Sort by manufacturer
|
||||
if ($0.manufacturer == $1.manufacturer) {
|
||||
// //2. Sort by console generation
|
||||
if ($0.generation == $1.generation) {
|
||||
// //3. Sort by console name
|
||||
return $0.name < $1.name
|
||||
}
|
||||
|
||||
return $0.generation! < $1.generation!
|
||||
}
|
||||
|
||||
return $0.manufacturer! < $1.manufacturer!
|
||||
}
|
||||
|
||||
do {
|
||||
try Disk.save(self.consoles, to: .caches, as: "consoles.json")
|
||||
}catch let error as NSError {
|
||||
print("Write of ConsoleItem not possible \(error.localizedDescription)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension GameCollection {
|
||||
static let consoleID : FlockeEntryID = "5b0c2ff8ba0c0b4ae7559911"
|
||||
static let videogameID : FlockeEntryID = "5b116282ba0c0b4ae75599be"
|
||||
static let wishlistID : FlockeEntryID = "5b11628dba0c0b4ae75599bf"
|
||||
static let accessoryID : FlockeEntryID = "5b1162ccba0c0b4ae75599c1"
|
||||
}
|
||||
45
Zockerhoehle/Utils/FlockeConnector.swift
Normal file
@@ -0,0 +1,45 @@
|
||||
//
|
||||
// FlockeConnector.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 29.10.18.
|
||||
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
class FlockeConnector {
|
||||
let flockeURL : URL?
|
||||
let bodyDict : NSDictionary?
|
||||
let requestType : String
|
||||
let completionHandler : (Data?, URLResponse?, Error?) -> Void
|
||||
|
||||
init(url : String, requestType : String = "GET", bodyDict : NSDictionary?, _ completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) {
|
||||
self.flockeURL = URL.init(string: url)
|
||||
self.bodyDict = bodyDict
|
||||
self.requestType = requestType
|
||||
self.completionHandler = completionHandler
|
||||
}
|
||||
|
||||
func doRequest() {
|
||||
guard let url = self.flockeURL else {
|
||||
print("DO Request: Creating URL fails")
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
do {
|
||||
let requestBodyJSON = try JSONSerialization.data(withJSONObject: self.bodyDict!)
|
||||
|
||||
var req = URLRequest.init(url: url)
|
||||
req.httpMethod = self.requestType
|
||||
req.httpBody = requestBodyJSON
|
||||
req.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
|
||||
|
||||
URLSession.shared.dataTask(with: req, completionHandler: self.completionHandler).resume()
|
||||
}catch {
|
||||
print("Cannot convert to JSON")
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
143
Zockerhoehle/Utils/FlockeWS.swift
Normal file
@@ -0,0 +1,143 @@
|
||||
//
|
||||
// FlockeLoader.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 13.09.18.
|
||||
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Disk
|
||||
|
||||
extension Notification.Name {
|
||||
static let FlockeWSDeleteFinished = Notification.Name("flockeWSDeleteFinished")
|
||||
static let FlockeWSAddFinished = Notification.Name("flockeWSAddFinished")
|
||||
}
|
||||
|
||||
class FlockeWS {
|
||||
@objc enum ERROR_STATE : Int {
|
||||
case NO_ERROR
|
||||
case REQUEST_FAILED
|
||||
}
|
||||
|
||||
static func fetchEntries(for parent: FlockeEntryID) {
|
||||
guard let fetchEntriesURL = URL.init(string: "http://flocke.mueller.haus:8081/entry/parent/\(parent)") else {
|
||||
print("FETCH ENTRIES: Creating URL fails")
|
||||
return
|
||||
}
|
||||
|
||||
let task = URLSession.shared.dataTask(with: fetchEntriesURL) { (data, resp, err) in
|
||||
if (err == nil) {
|
||||
let consoles : [FlockeEntry] = try! JSONDecoder().decode([FlockeEntry].self, from: data!)
|
||||
|
||||
DispatchQueue.main.async {
|
||||
GameCollection.shared.updateGameItems(items: consoles, with: parent)
|
||||
}
|
||||
}
|
||||
}
|
||||
task.resume()
|
||||
}
|
||||
|
||||
static func fetchAttachment(attachment attachmentId : AttachmentID) {
|
||||
guard let fetchAttachmentURL = URL.init(string: "http://flocke.mueller.haus:8081/attachment/\(attachmentId)") else {
|
||||
print("FETCH ATTACHMENT: Creating URL fails")
|
||||
return
|
||||
}
|
||||
|
||||
URLSession.shared.dataTask(with: fetchAttachmentURL) { (data, resp, err) in
|
||||
if (err == nil) {
|
||||
let attachment : Attachment = try! JSONDecoder().decode(Attachment.self, from: data!)
|
||||
|
||||
|
||||
DispatchQueue.main.async {
|
||||
GameCollection.shared.updateAttachment(attachment: attachment)
|
||||
}
|
||||
}
|
||||
|
||||
}.resume()
|
||||
}
|
||||
|
||||
static func deleteEntry(by entry: FlockeEntryID) {
|
||||
guard let flockeDeleteEntryURL = URL.init(string: "http://flocke.mueller.haus:8081/entry/\(entry)") else {
|
||||
print("DELETE ENTRY: Creating URL fails")
|
||||
return
|
||||
}
|
||||
|
||||
var req = URLRequest.init(url: flockeDeleteEntryURL)
|
||||
req.httpMethod = "DELETE"
|
||||
|
||||
URLSession.shared.dataTask(with: req) { (data, resp, err) in
|
||||
if (err == nil) {
|
||||
DispatchQueue.main.async {
|
||||
//TODO GameCollection Update
|
||||
NotificationCenter.default.post(name: .FlockeWSDeleteFinished, object: nil)
|
||||
}
|
||||
}
|
||||
}.resume()
|
||||
}
|
||||
|
||||
static func deleteParents(entry entryID : FlockeEntryID, parents : [FlockeEntryID]) {
|
||||
print("DELETE PARENTS WS \(entryID) - \(parents)")
|
||||
|
||||
let addJSON : NSMutableDictionary = NSMutableDictionary()
|
||||
addJSON.setValue(entryID, forKey: "id")
|
||||
addJSON.setValue(parents, forKey: "parents")
|
||||
|
||||
do {
|
||||
let jsonBodyData = try JSONSerialization.data(withJSONObject: addJSON, options: [])
|
||||
let jsonBodyString = String(data: jsonBodyData, encoding: .utf8) ?? "{}"
|
||||
print(jsonBodyString)
|
||||
|
||||
let connector : FlockeConnector = FlockeConnector(url: "http://flocke.mueller.haus:8081/entry/deleteParents",
|
||||
requestType: "PUT",
|
||||
bodyDict: addJSON) { (data, resp, err) in
|
||||
// DispatchQueue.main.async {
|
||||
// //NOP
|
||||
// }
|
||||
}
|
||||
|
||||
connector.doRequest()
|
||||
}catch {
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static func addEntry(name : String, consoleID : FlockeEntryID, isVideogame : Bool, isOnWishlist : Bool) {
|
||||
print("ADD WS \(name) \(isVideogame) \(isOnWishlist)")
|
||||
|
||||
var parents : [String] = [consoleID]
|
||||
|
||||
if (isVideogame) {
|
||||
parents.append(GameCollection.videogameID)
|
||||
}else{
|
||||
parents.append(GameCollection.accessoryID)
|
||||
}
|
||||
|
||||
if isOnWishlist {
|
||||
parents.append(GameCollection.wishlistID)
|
||||
}
|
||||
|
||||
let addJSON : NSMutableDictionary = NSMutableDictionary()
|
||||
addJSON.setValue(name, forKey: "name")
|
||||
addJSON.setValue(parents, forKey: "parents")
|
||||
|
||||
let connector : FlockeConnector = FlockeConnector(url: "http://flocke.mueller.haus:8081/entry/",
|
||||
requestType: "POST",
|
||||
bodyDict: addJSON) { (data, resp, err) in
|
||||
var requestError = FlockeWS.ERROR_STATE.NO_ERROR
|
||||
|
||||
if (err != nil) { requestError = FlockeWS.ERROR_STATE.REQUEST_FAILED }
|
||||
|
||||
|
||||
DispatchQueue.main.async {
|
||||
let userInfo:[String: FlockeWS.ERROR_STATE] = ["error_state": requestError]
|
||||
NotificationCenter.default.post(name: .FlockeWSAddFinished, object: nil, userInfo: userInfo)
|
||||
}
|
||||
}
|
||||
|
||||
connector.doRequest()
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
//
|
||||
// ViewController.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 12.09.18.
|
||||
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
class ViewController: UIViewController {
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
// Do any additional setup after loading the view, typically from a nib.
|
||||
}
|
||||
|
||||
override func didReceiveMemoryWarning() {
|
||||
super.didReceiveMemoryWarning()
|
||||
// Dispose of any resources that can be recreated.
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
20
Zockerhoehle/ViewController/AccessoryDetailController.swift
Normal file
@@ -0,0 +1,20 @@
|
||||
//
|
||||
// AccessoryDetailController.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 12.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import UIKit
|
||||
import SwiftUI
|
||||
|
||||
class AccessoryDetailController : UIViewController {
|
||||
var accessory : Accessory?
|
||||
|
||||
|
||||
@IBSegueAction func emebdedAccessoryDetaio(_ coder: NSCoder) -> UIViewController? {
|
||||
return UIHostingController(coder: coder, rootView: AccessoryDetailView(accessory: accessory))
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
//
|
||||
// AddEntryPopUpViewController.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 20.09.18.
|
||||
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
class AddEntryPopUpViewController: UIViewController {
|
||||
var isWishlist : Bool = false
|
||||
var isVideogame : Bool = true
|
||||
var console : Console?
|
||||
|
||||
@IBOutlet weak var icon: UIImageView!
|
||||
@IBOutlet weak var category: UISegmentedControl!
|
||||
@IBOutlet weak var wishlistIcon: UIImageView!
|
||||
@IBOutlet weak var name: UITextField!
|
||||
@IBOutlet weak var addButton: UIButtonX!
|
||||
|
||||
override func viewWillAppear(_ animated: Bool) {
|
||||
super.viewWillAppear(animated)
|
||||
|
||||
self.category.selectedSegmentIndex = 0
|
||||
|
||||
if (!self.isVideogame && !self.isWishlist) {
|
||||
self.category.selectedSegmentIndex = 1
|
||||
}
|
||||
|
||||
self.wishlistIcon.isHidden = !self.isWishlist
|
||||
|
||||
self.icon.image = self.console?.logo?.image
|
||||
|
||||
//If the name is not filled the add Button should be disabled
|
||||
addButton.isEnabled = name.text != ""
|
||||
}
|
||||
|
||||
@IBAction func nameChanged(_ sender: Any) {
|
||||
addButton.isEnabled = name.text != ""
|
||||
}
|
||||
|
||||
@IBAction func add(_ sender: Any) {
|
||||
self.isVideogame = self.category.selectedSegmentIndex == 0
|
||||
|
||||
guard let name = self.name.text else {
|
||||
print("ERROR AddEntryPopoUpViewController::Add; Game name is empty")
|
||||
return
|
||||
}
|
||||
|
||||
if self.isVideogame {
|
||||
let game = Game(entity: Game.entity(), insertInto: CDManager.shared.viewContext)
|
||||
game.name = name
|
||||
game.console = console
|
||||
|
||||
print("Added Game '\(game.name)'")
|
||||
}else{
|
||||
let accessory = Accessory(entity: Accessory.entity(), insertInto: CDManager.shared.viewContext)
|
||||
accessory.name = name
|
||||
accessory.console = console
|
||||
|
||||
print("Added Accessory '\(accessory.name)'")
|
||||
}
|
||||
|
||||
self.dismiss(animated: true)
|
||||
}
|
||||
|
||||
@IBAction func cancel(_ sender: Any) {
|
||||
self.dismiss(animated: true)
|
||||
}
|
||||
}
|
||||
78
Zockerhoehle/ViewController/AllConsolesViewController.swift
Normal file
@@ -0,0 +1,78 @@
|
||||
//
|
||||
// UIConsoleTableViewController.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 12.09.18.
|
||||
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import CoreData
|
||||
|
||||
class AllConsolesViewController: UIViewController, NSFetchedResultsControllerDelegate {
|
||||
@IBOutlet weak var consolesTable: UITableView!
|
||||
@IBOutlet weak var manufacturer: UILabel!
|
||||
@IBOutlet weak var consoleLogo: UIImageView!
|
||||
|
||||
lazy var fetchResultsController : NSFetchedResultsController<Console> = {
|
||||
let consolesFetch : NSFetchRequest<Console> = Console.fetchRequest()
|
||||
|
||||
consolesFetch.sortDescriptors = [NSSortDescriptor(key: "manufacturer", ascending: true), NSSortDescriptor(key: "generation", ascending: true), NSSortDescriptor(key: "name", ascending: true)]
|
||||
|
||||
var consolesfetchRC = NSFetchedResultsController(fetchRequest: consolesFetch, managedObjectContext: CDManager.shared.viewContext, sectionNameKeyPath: nil, cacheName: nil)
|
||||
|
||||
consolesfetchRC.delegate = self
|
||||
|
||||
return consolesfetchRC
|
||||
|
||||
}()
|
||||
|
||||
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
|
||||
print("AllConsolesViewController::controllerDidChangeContent")
|
||||
self.consolesTable.reloadData()
|
||||
}
|
||||
|
||||
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
|
||||
if (segue.identifier == "consoleDetail" && sender! is ConsoleCell) {
|
||||
guard let consoleVC = segue.destination as? ConsoleLibraryViewController else {
|
||||
return
|
||||
}
|
||||
guard let consoleCell = sender as? ConsoleCell else {
|
||||
return
|
||||
}
|
||||
|
||||
consoleVC.console = consoleCell.console
|
||||
}
|
||||
}
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
FlockeWS.fetchEntries(for: GameCollection.consoleID)
|
||||
do {
|
||||
try fetchResultsController.performFetch()
|
||||
}catch{
|
||||
print("AllConsolesViewController::viewDidLoad: Fetch not possible");
|
||||
}
|
||||
}
|
||||
}
|
||||
extension AllConsolesViewController: UITableViewDataSource {
|
||||
func numberOfSections(in tableView: UITableView) -> Int {
|
||||
guard let sections = fetchResultsController.sections else { return 0 }
|
||||
|
||||
return sections.count
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||||
guard let sections = fetchResultsController.sections else { return 0 }
|
||||
|
||||
return sections[section].numberOfObjects
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||||
let cell = (tableView.dequeueReusableCell(withIdentifier: "ConsoleCell", for: indexPath)) as! ConsoleCell
|
||||
|
||||
cell.console = fetchResultsController.object(at: indexPath)
|
||||
|
||||
return cell
|
||||
}
|
||||
}
|
||||
189
Zockerhoehle/ViewController/ConsoleLibraryViewController.swift
Normal file
@@ -0,0 +1,189 @@
|
||||
//
|
||||
// ConsoleViewController.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 12.09.18.
|
||||
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import CoreData
|
||||
import Combine
|
||||
|
||||
class ConsoleLibraryViewController: UIViewController {
|
||||
@IBOutlet weak var consoleItemTable: UITableView!
|
||||
@IBOutlet weak var category: UISegmentedControl!
|
||||
@IBOutlet weak var toggleWishList: UIBarButtonItem!
|
||||
|
||||
var subsriber : Subscribers.Sink<NSSet, Never>?
|
||||
var videoGamesInLibrary : [Bool : [Game]] = [:]
|
||||
var accessoriesinLibrary : [Bool : [Accessory]] = [:]
|
||||
var showWishlist : Bool = false
|
||||
|
||||
var console : Console? {
|
||||
didSet {
|
||||
self.title = console?.name ?? "N/A"
|
||||
|
||||
//Remove subscription to old console object
|
||||
subsriber?.cancel()
|
||||
|
||||
subsriber = console?.publisher(for: \.games, options: .new).sink(receiveValue: {_ in
|
||||
self.refreshConsoleLibrary()
|
||||
})
|
||||
|
||||
refreshConsoleLibrary()
|
||||
}
|
||||
}
|
||||
|
||||
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
|
||||
if segue.identifier == "detail" {
|
||||
guard let indexpath = self.consoleItemTable.indexPathForSelectedRow else {
|
||||
print("ConsoleLibraryViewController::prepare::detail IndexPath for selectedRow could not be retreived")
|
||||
return
|
||||
}
|
||||
|
||||
if let dest = segue.destination as? GameDetailController {
|
||||
dest.game = self.videoGamesInLibrary[self.showWishlist]?[indexpath.row]
|
||||
}else if let dest = segue.destination as? AccessoryDetailController {
|
||||
dest.accessory = self.accessoriesinLibrary[self.showWishlist]?[indexpath.row]
|
||||
}
|
||||
}else if (segue.identifier == "consoleEntryAdd") {
|
||||
guard let addPopup = segue.destination as? AddEntryPopUpViewController else {
|
||||
print("ConsoleLibraryViewController::prepare::consoleEntryAdd Destination is no AddEntryPopUpViewController")
|
||||
return
|
||||
}
|
||||
|
||||
addPopup.console = self.console
|
||||
addPopup.isVideogame = self.category.selectedSegmentIndex == 0
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@IBAction func categoryChanged(_ sender: Any) {
|
||||
self.consoleItemTable.reloadData()
|
||||
}
|
||||
|
||||
override func viewWillAppear(_ animated: Bool) {
|
||||
if self.showWishlist {
|
||||
self.toggleWishList.tintColor = UIColor.red
|
||||
}else{
|
||||
self.toggleWishList.tintColor = UIColor.black
|
||||
}
|
||||
|
||||
self.toggleWishList.tintColor = UIColor.black
|
||||
}
|
||||
|
||||
func refreshConsoleLibrary() {
|
||||
let videogames = self.console?.games.map({$0 as! Game}) ?? []
|
||||
self.videoGamesInLibrary[true] = videogames.filter({$0.inWishlist})
|
||||
self.videoGamesInLibrary[false] = videogames.filter({!$0.inWishlist})
|
||||
|
||||
let accessories = self.console?.accessories.map({$0 as! Accessory}) ?? []
|
||||
self.accessoriesinLibrary[true] = accessories.filter({$0.inWishlist})
|
||||
self.accessoriesinLibrary[false] = accessories.filter({!$0.inWishlist})
|
||||
|
||||
consoleItemTable?.reloadData()
|
||||
}
|
||||
|
||||
@IBAction func toggleWishlist(_ sender: Any) {
|
||||
self.showWishlist = !self.showWishlist
|
||||
|
||||
if self.showWishlist {
|
||||
self.toggleWishList.tintColor = UIColor.red
|
||||
}else{
|
||||
self.toggleWishList.tintColor = UIColor.black
|
||||
}
|
||||
|
||||
consoleItemTable.reloadData()
|
||||
}
|
||||
}
|
||||
|
||||
extension ConsoleLibraryViewController: UITableViewDataSource {
|
||||
func numberOfSections(in tableView: UITableView) -> Int {
|
||||
return 1
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||||
if self.category.selectedSegmentIndex == 0 {
|
||||
return self.videoGamesInLibrary[self.showWishlist]?.count ?? 0
|
||||
}else{
|
||||
return self.accessoriesinLibrary[self.showWishlist]?.count ?? 0
|
||||
}
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||||
if self.category.selectedSegmentIndex == 0 {
|
||||
let gameCell = tableView.dequeueReusableCell(withIdentifier: "gameCell") as! GameCell
|
||||
|
||||
gameCell.game = self.videoGamesInLibrary[self.showWishlist]?[indexPath.row]
|
||||
|
||||
return gameCell
|
||||
}else{
|
||||
let accessoryCell = tableView.dequeueReusableCell(withIdentifier: "accessoryCell") as! AccessoryCell
|
||||
|
||||
|
||||
accessoryCell.accessory = self.accessoriesinLibrary[self.showWishlist]?[indexPath.row]
|
||||
|
||||
return accessoryCell
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Swipe Action - Delete / move console items from / into the library
|
||||
extension ConsoleLibraryViewController: UITableViewDelegate {
|
||||
|
||||
// Move console item to library
|
||||
func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
|
||||
let bought = UIContextualAction(style: .destructive, title: "") { (action, view, actionDone) in
|
||||
actionDone(true)
|
||||
if self.category.selectedSegmentIndex == 0 {
|
||||
let game = self.videoGamesInLibrary[self.showWishlist]?[indexPath.row]
|
||||
game?.inWishlist = false
|
||||
}else{
|
||||
let accessory = self.accessoriesinLibrary[self.showWishlist]?[indexPath.row]
|
||||
accessory?.inWishlist = false
|
||||
}
|
||||
|
||||
self.refreshConsoleLibrary()
|
||||
}
|
||||
|
||||
bought.image = #imageLiteral(resourceName: "cave")
|
||||
bought.backgroundColor = #colorLiteral(red: 0.4666666687, green: 0.7647058964, blue: 0.2666666806, alpha: 1)
|
||||
|
||||
if (self.showWishlist) {
|
||||
return UISwipeActionsConfiguration(actions: [bought])
|
||||
}
|
||||
|
||||
return UISwipeActionsConfiguration(actions: [])
|
||||
}
|
||||
|
||||
// Delete console item from library
|
||||
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
|
||||
/*let selectedItem = self.consoleItemsToDisplay()[indexPath.row]
|
||||
let delete = UIContextualAction(style: .destructive, title: "Delete") { (action, view, actionDone) in
|
||||
let deleteWarning = UIAlertController( title: "Aus Zockerhöhle entfernen",
|
||||
message: "Willst du '\("N/A")' wirklich aus der Zockerhöhle tragen?",
|
||||
preferredStyle: .alert)
|
||||
|
||||
deleteWarning.addAction(UIAlertAction(title: "Ja", style: .destructive, handler: { (action) in
|
||||
actionDone(true)
|
||||
|
||||
//FlockeWS.deleteEntry(by: selectedItem.id);
|
||||
//GameCollection.shared.removeGameItem(from: self.currentConsole!, item: selectedItem)
|
||||
}))
|
||||
|
||||
deleteWarning.addAction(UIAlertAction(title: "Nein", style: .cancel, handler: { (action) in
|
||||
actionDone(false)
|
||||
}))
|
||||
|
||||
self.present(deleteWarning, animated: true, completion: nil)
|
||||
}*/
|
||||
|
||||
//delete.image = #imageLiteral(resourceName: "delete")
|
||||
//delete.backgroundColor = #colorLiteral(red: 0.7450980544, green: 0.1568627506, blue: 0.07450980693, alpha: 1)
|
||||
|
||||
return UISwipeActionsConfiguration(actions: [])//delete])
|
||||
}
|
||||
}
|
||||
20
Zockerhoehle/ViewController/GameDetailController.swift
Normal file
@@ -0,0 +1,20 @@
|
||||
//
|
||||
// ConsoleDetailEmbewdViewController.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 08.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import UIKit
|
||||
import SwiftUI
|
||||
|
||||
class GameDetailController : UIViewController {
|
||||
var game : Game?
|
||||
|
||||
|
||||
@IBSegueAction func embedConsoleDetail(_ coder: NSCoder) -> UIViewController? {
|
||||
return UIHostingController(coder: coder, rootView: GameDetailView(game: game))
|
||||
}
|
||||
}
|
||||
24
Zockerhoehle/Views/AccessoryCell.swift
Normal file
@@ -0,0 +1,24 @@
|
||||
//
|
||||
// AccessoryCell.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 12.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
class AccessoryCell: UITableViewCell {
|
||||
@IBOutlet weak var name: UILabel!
|
||||
|
||||
var accessory : Accessory? {
|
||||
didSet {
|
||||
self.name.text = accessory?.name ?? "N/A"
|
||||
}
|
||||
}
|
||||
|
||||
/*func setAccessory(accessory : Accessory?) {
|
||||
self.accessory = accessory
|
||||
self.name.text = accessory?.name ?? "N/A"
|
||||
}*/
|
||||
}
|
||||
29
Zockerhoehle/Views/AccessoryDetailView.swift
Normal file
@@ -0,0 +1,29 @@
|
||||
//
|
||||
// AccessoryDetailView.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 12.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct AccessoryDetailView : View {
|
||||
var accessory : Accessory?
|
||||
|
||||
var body: some View {
|
||||
Text(accessory?.name ?? "N/A").color(Color.red)
|
||||
}
|
||||
|
||||
init(accessory : Accessory?) {
|
||||
self.accessory = accessory
|
||||
}
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
struct AccessoryDetailView_Previews : PreviewProvider {
|
||||
static var previews: some View {
|
||||
AccessoryDetailView(accessory: nil)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
30
Zockerhoehle/Views/ConsoleCell.swift
Normal file
@@ -0,0 +1,30 @@
|
||||
//
|
||||
// ConsoleCell.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 12.09.18.
|
||||
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
class ConsoleCell: UITableViewCell {
|
||||
@IBOutlet weak var consoleName: UILabel!
|
||||
@IBOutlet weak var logo: UIImageView!
|
||||
@IBOutlet weak var gamesCounter: UILabel!
|
||||
@IBOutlet weak var accessoryCounter: UILabel!
|
||||
|
||||
public var console: Console? {
|
||||
didSet {
|
||||
consoleName.text = console?.name
|
||||
self.logo.image = console?.logo?.image
|
||||
|
||||
let ownedGames = console?.games.filtered(using: NSPredicate(format: "inWishlist = false")).count ?? 0
|
||||
let ownedAccessories = console?.accessories.filtered(using: NSPredicate(format: "inWishlist = false")).count ?? 0
|
||||
self.gamesCounter.text = "\(ownedGames)"
|
||||
self.accessoryCounter.text = "\(ownedAccessories)"
|
||||
|
||||
self.setNeedsDisplay()
|
||||
}
|
||||
}
|
||||
}
|
||||
20
Zockerhoehle/Views/GameCell.swift
Normal file
@@ -0,0 +1,20 @@
|
||||
//
|
||||
// GameCell.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 16.09.18.
|
||||
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
class GameCell: UITableViewCell {
|
||||
@IBOutlet weak var name: UILabel!
|
||||
|
||||
var game : Game? {
|
||||
didSet {
|
||||
self.name.text = game?.name ?? "N/A"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
28
Zockerhoehle/Views/GameDetailView.swift
Normal file
@@ -0,0 +1,28 @@
|
||||
//
|
||||
// GameDetailView.swift
|
||||
// Zockerhoehle
|
||||
//
|
||||
// Created by Julian-Steffen Müller on 08.07.19.
|
||||
// Copyright © 2019 Julian-Steffen Müller. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct GameDetailView : View {
|
||||
var game : Game?
|
||||
var body: some View {
|
||||
Text(game?.name ?? "N/A")
|
||||
}
|
||||
|
||||
init(game : Game?) {
|
||||
self.game = game
|
||||
}
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
struct GameDetailView_Previews : PreviewProvider {
|
||||
static var previews: some View {
|
||||
GameDetailView(game: nil)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="14865.6" systemVersion="18F132" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
|
||||
<entity name="Accessory" representedClassName="Accessory" syncable="YES">
|
||||
<attribute name="color" optional="YES" attributeType="String"/>
|
||||
<attribute name="inWishlist" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||
<attribute name="manufacturer" optional="YES" attributeType="String"/>
|
||||
<attribute name="name" attributeType="String"/>
|
||||
<relationship name="console" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Console" inverseName="accessories" inverseEntity="Console"/>
|
||||
</entity>
|
||||
<entity name="Console" representedClassName="Console" syncable="YES">
|
||||
<attribute name="generation" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES"/>
|
||||
<attribute name="manufacturer" optional="YES" attributeType="String"/>
|
||||
<attribute name="name" attributeType="String"/>
|
||||
<relationship name="accessories" toMany="YES" deletionRule="Nullify" destinationEntity="Accessory" inverseName="console" inverseEntity="Accessory"/>
|
||||
<relationship name="games" toMany="YES" deletionRule="Nullify" destinationEntity="Game" inverseName="console" inverseEntity="Game"/>
|
||||
<relationship name="logo" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Logo" inverseName="console" inverseEntity="Logo"/>
|
||||
</entity>
|
||||
<entity name="Cover" representedClassName="Cover" syncable="YES">
|
||||
<attribute name="image" optional="YES" attributeType="Transformable"/>
|
||||
<relationship name="game" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Game" inverseName="cover" inverseEntity="Game"/>
|
||||
</entity>
|
||||
<entity name="Game" representedClassName="Game" syncable="YES">
|
||||
<attribute name="finished" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
|
||||
<attribute name="inWishlist" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||
<attribute name="isDigital" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||
<attribute name="name" attributeType="String"/>
|
||||
<attribute name="notes" optional="YES" attributeType="String"/>
|
||||
<attribute name="publisher" optional="YES" attributeType="String"/>
|
||||
<relationship name="console" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Console" inverseName="games" inverseEntity="Console"/>
|
||||
<relationship name="cover" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Cover" inverseName="game" inverseEntity="Cover"/>
|
||||
<relationship name="series" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="GameSeries" inverseName="games" inverseEntity="GameSeries"/>
|
||||
<fetchedProperty name="fetchedProperty" optional="YES">
|
||||
<fetchRequest name="fetchedPropertyFetchRequest" entity="Game"/>
|
||||
</fetchedProperty>
|
||||
</entity>
|
||||
<entity name="GameSeries" representedClassName="GameSeries" syncable="YES">
|
||||
<attribute name="cover" optional="YES" attributeType="Binary" allowsExternalBinaryDataStorage="YES"/>
|
||||
<attribute name="name" optional="YES" attributeType="String"/>
|
||||
<relationship name="games" toMany="YES" deletionRule="Nullify" destinationEntity="Game" inverseName="series" inverseEntity="Game"/>
|
||||
</entity>
|
||||
<entity name="Logo" representedClassName="Logo" syncable="YES">
|
||||
<attribute name="image" optional="YES" attributeType="Transformable"/>
|
||||
<relationship name="console" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Console" inverseName="logo" inverseEntity="Console"/>
|
||||
</entity>
|
||||
<elements>
|
||||
<element name="Accessory" positionX="-265.9140625" positionY="29.15625" width="128" height="118"/>
|
||||
<element name="Console" positionX="-535.7890625" positionY="56.03515625" width="128" height="133"/>
|
||||
<element name="Cover" positionX="-66.69921875" positionY="223.48046875" width="128" height="73"/>
|
||||
<element name="Game" positionX="-288.828125" positionY="276.7421875" width="128" height="206"/>
|
||||
<element name="GameSeries" positionX="-519.2421875" positionY="317.87890625" width="128" height="88"/>
|
||||
<element name="Logo" positionX="-66.7109375" positionY="110.9765625" width="128" height="73"/>
|
||||
</elements>
|
||||
</model>
|
||||
@@ -0,0 +1,71 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14313.18" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="Tsr-WJ-blf">
|
||||
<device id="retina4_7" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14283.14"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--View Controller-->
|
||||
<scene sceneID="Ac8-KI-6pg">
|
||||
<objects>
|
||||
<viewController modalPresentationStyle="overCurrentContext" id="Tsr-WJ-blf" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="Zxp-Kz-1oc">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Mjk-GR-N6g" customClass="UIViewX" customModule="Zockerhoehle" customModuleProvider="target">
|
||||
<rect key="frame" x="20" y="266.5" width="335" height="100"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Moment. Trage in die Bärenhöhle" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DcG-R4-dIc">
|
||||
<rect key="frame" x="41" y="10" width="253" height="21"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" animating="YES" style="whiteLarge" translatesAutoresizingMaskIntoConstraints="NO" id="ZXD-Jd-WGx">
|
||||
<rect key="frame" x="149" y="48" width="37" height="37"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="37" id="2YT-Ml-z6B"/>
|
||||
<constraint firstAttribute="width" constant="37" id="mvC-eV-Bbg"/>
|
||||
</constraints>
|
||||
<color key="color" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</activityIndicatorView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="DcG-R4-dIc" firstAttribute="top" secondItem="Mjk-GR-N6g" secondAttribute="top" constant="10" id="Bzi-Iy-fjt"/>
|
||||
<constraint firstAttribute="height" constant="100" id="myW-Z6-Vg5"/>
|
||||
<constraint firstItem="DcG-R4-dIc" firstAttribute="centerX" secondItem="Mjk-GR-N6g" secondAttribute="centerX" id="uyl-po-zxV"/>
|
||||
<constraint firstItem="ZXD-Jd-WGx" firstAttribute="centerX" secondItem="Mjk-GR-N6g" secondAttribute="centerX" id="vl2-t8-THz"/>
|
||||
<constraint firstAttribute="bottom" secondItem="ZXD-Jd-WGx" secondAttribute="bottom" constant="15" id="wkl-H8-k2u"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
|
||||
<real key="value" value="0.0"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="8"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.40000000000000002" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="Mjk-GR-N6g" firstAttribute="centerY" secondItem="Zxp-Kz-1oc" secondAttribute="centerY" constant="-17" id="HX9-Xs-wAJ"/>
|
||||
<constraint firstItem="ZjD-zX-qAW" firstAttribute="trailing" secondItem="Mjk-GR-N6g" secondAttribute="trailing" constant="20" id="HuJ-6k-cDN"/>
|
||||
<constraint firstItem="Mjk-GR-N6g" firstAttribute="leading" secondItem="ZjD-zX-qAW" secondAttribute="leading" constant="20" id="fF1-31-1A1"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="ZjD-zX-qAW"/>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="BPh-Jc-fxg" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="2937" y="163"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
||||
1
Zockerhoehle/de.lproj/Main.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||