Current transformation stage

This commit is contained in:
Dr. Julian-Steffen Müller
2019-07-12 12:59:42 +02:00
parent dbb04fcee9
commit 7543748025
75 changed files with 2772 additions and 92 deletions

5
.gitignore vendored Normal file
View 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

1
Cartfile Normal file
View File

@@ -0,0 +1 @@
github "dstranz/Disk" "feature/SPM_xcode11"

View 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>

View File

@@ -7,21 +7,89 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* 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 */; }; 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 */; }; B93C1BA221496BFD0014FD6E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B93C1BA021496BFD0014FD6E /* Main.storyboard */; };
B93C1BA421496BFE0014FD6E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B93C1BA321496BFE0014FD6E /* Assets.xcassets */; }; 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 */ /* End PBXBuildFile section */
/* Begin PBXFileReference 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; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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 */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@@ -35,11 +103,74 @@
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup 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 = { B93C1B9021496BFD0014FD6E = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
B93C1B9B21496BFD0014FD6E /* Zockerhoehle */, B93C1B9B21496BFD0014FD6E /* Zockerhoehle */,
B93C1B9A21496BFD0014FD6E /* Products */, B93C1B9A21496BFD0014FD6E /* Products */,
B90B64A12235909900E54BA3 /* Frameworks */,
B94CB53522D3708F0029BFAD /* Zockerhoehle copy-Info.plist */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@@ -54,16 +185,43 @@
B93C1B9B21496BFD0014FD6E /* Zockerhoehle */ = { B93C1B9B21496BFD0014FD6E /* Zockerhoehle */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
B98A734622BACA9C00FB3410 /* CDModel */,
B926F14821502D7F004D36B7 /* Lib */,
B926F13A214AF21B004D36B7 /* Utils */,
B926F136214AE2E3004D36B7 /* Views */,
B926F135214AE2D4004D36B7 /* ViewController */,
B926F134214AE2C0004D36B7 /* Model */,
B93C1B9C21496BFD0014FD6E /* AppDelegate.swift */, B93C1B9C21496BFD0014FD6E /* AppDelegate.swift */,
B93C1B9E21496BFD0014FD6E /* ViewController.swift */, B9BCF521217900D700ECBAAC /* WaitingPopOver.storyboard */,
B93C1BA021496BFD0014FD6E /* Main.storyboard */, B93C1BA021496BFD0014FD6E /* Main.storyboard */,
B9BCF4C92168ACB600ECBAAC /* LaunchScreen.storyboard */,
B98A735F22C1738800FB3410 /* CDManager.swift */,
B93C1BA321496BFE0014FD6E /* Assets.xcassets */, B93C1BA321496BFE0014FD6E /* Assets.xcassets */,
B93C1BA521496BFE0014FD6E /* LaunchScreen.storyboard */,
B93C1BA821496BFE0014FD6E /* Info.plist */, B93C1BA821496BFE0014FD6E /* Info.plist */,
B98A731722BA9E4600FB3410 /* Zockerhoehle.xcdatamodeld */,
); );
path = Zockerhoehle; path = Zockerhoehle;
sourceTree = "<group>"; 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 */ /* End PBXGroup section */
/* Begin PBXNativeTarget section */ /* Begin PBXNativeTarget section */
@@ -74,6 +232,7 @@
B93C1B9521496BFD0014FD6E /* Sources */, B93C1B9521496BFD0014FD6E /* Sources */,
B93C1B9621496BFD0014FD6E /* Frameworks */, B93C1B9621496BFD0014FD6E /* Frameworks */,
B93C1B9721496BFD0014FD6E /* Resources */, B93C1B9721496BFD0014FD6E /* Resources */,
B90B64A4223590DA00E54BA3 /* ShellScript */,
); );
buildRules = ( buildRules = (
); );
@@ -96,6 +255,7 @@
TargetAttributes = { TargetAttributes = {
B93C1B9821496BFD0014FD6E = { B93C1B9821496BFD0014FD6E = {
CreatedOnToolsVersion = 9.4.1; CreatedOnToolsVersion = 9.4.1;
LastSwiftMigration = 1020;
}; };
}; };
}; };
@@ -106,6 +266,7 @@
knownRegions = ( knownRegions = (
en, en,
Base, Base,
de,
); );
mainGroup = B93C1B9021496BFD0014FD6E; mainGroup = B93C1B9021496BFD0014FD6E;
productRefGroup = B93C1B9A21496BFD0014FD6E /* Products */; productRefGroup = B93C1B9A21496BFD0014FD6E /* Products */;
@@ -122,21 +283,75 @@
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
B93C1BA721496BFE0014FD6E /* LaunchScreen.storyboard in Resources */, B9BCF4CA2168ACB600ECBAAC /* LaunchScreen.storyboard in Resources */,
B93C1BA421496BFE0014FD6E /* Assets.xcassets in Resources */, B93C1BA421496BFE0014FD6E /* Assets.xcassets in Resources */,
B9BCF523217900D700ECBAAC /* WaitingPopOver.storyboard in Resources */,
B93C1BA221496BFD0014FD6E /* Main.storyboard in Resources */, B93C1BA221496BFD0014FD6E /* Main.storyboard in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
/* End PBXResourcesBuildPhase section */ /* 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 */ /* Begin PBXSourcesBuildPhase section */
B93C1B9521496BFD0014FD6E /* Sources */ = { B93C1B9521496BFD0014FD6E /* Sources */ = {
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( 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 */, 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; runOnlyForDeploymentPostprocessing = 0;
}; };
@@ -147,16 +362,17 @@
isa = PBXVariantGroup; isa = PBXVariantGroup;
children = ( children = (
B93C1BA121496BFD0014FD6E /* Base */, B93C1BA121496BFD0014FD6E /* Base */,
B93C1BAE21496CC50014FD6E /* de */,
); );
name = Main.storyboard; name = Main.storyboard;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
B93C1BA521496BFE0014FD6E /* LaunchScreen.storyboard */ = { B9BCF521217900D700ECBAAC /* WaitingPopOver.storyboard */ = {
isa = PBXVariantGroup; isa = PBXVariantGroup;
children = ( children = (
B93C1BA621496BFE0014FD6E /* Base */, B9BCF522217900D700ECBAAC /* Base */,
); );
name = LaunchScreen.storyboard; name = WaitingPopOver.storyboard;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
/* End PBXVariantGroup section */ /* End PBXVariantGroup section */
@@ -166,6 +382,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@@ -213,7 +430,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.4; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = YES; MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos; SDKROOT = iphoneos;
@@ -226,6 +443,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@@ -267,7 +485,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.4; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule; SWIFT_COMPILATION_MODE = wholemodule;
@@ -282,6 +500,10 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = M9N7K3KZX9; DEVELOPMENT_TEAM = M9N7K3KZX9;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Carthage/Build/iOS",
);
INFOPLIST_FILE = Zockerhoehle/Info.plist; INFOPLIST_FILE = Zockerhoehle/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
@@ -289,7 +511,7 @@
); );
PRODUCT_BUNDLE_IDENTIFIER = "de.mm-neuemedien.Zockerhoehle"; PRODUCT_BUNDLE_IDENTIFIER = "de.mm-neuemedien.Zockerhoehle";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 4.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
}; };
name = Debug; name = Debug;
@@ -300,6 +522,10 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = M9N7K3KZX9; DEVELOPMENT_TEAM = M9N7K3KZX9;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Carthage/Build/iOS",
);
INFOPLIST_FILE = Zockerhoehle/Info.plist; INFOPLIST_FILE = Zockerhoehle/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
@@ -307,7 +533,7 @@
); );
PRODUCT_BUNDLE_IDENTIFIER = "de.mm-neuemedien.Zockerhoehle"; PRODUCT_BUNDLE_IDENTIFIER = "de.mm-neuemedien.Zockerhoehle";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 4.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
}; };
name = Release; name = Release;
@@ -334,6 +560,19 @@
defaultConfigurationName = Release; defaultConfigurationName = Release;
}; };
/* End XCConfigurationList section */ /* 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 */; rootObject = B93C1B9121496BFD0014FD6E /* Project object */;
} }

View File

@@ -4,11 +4,24 @@
<dict> <dict>
<key>SchemeUserState</key> <key>SchemeUserState</key>
<dict> <dict>
<key>Zockerhoehle copy.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
</dict>
<key>Zockerhoehle.xcscheme</key> <key>Zockerhoehle.xcscheme</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>0</integer> <integer>0</integer>
</dict> </dict>
</dict> </dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>B93C1B9821496BFD0014FD6E</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict> </dict>
</plist> </plist>

View File

@@ -7,15 +7,23 @@
// //
import UIKit import UIKit
import CoreData
@UIApplicationMain @UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate { class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow? var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch. // 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 return true
} }
@@ -40,7 +48,5 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func applicationWillTerminate(_ application: UIApplication) { func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
} }
} }

View File

@@ -1,93 +1,111 @@
{ {
"images" : [ "images" : [
{ {
"idiom" : "iphone",
"size" : "20x20", "size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-40.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"idiom" : "iphone",
"size" : "20x20", "size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-60.png",
"scale" : "3x" "scale" : "3x"
}, },
{ {
"idiom" : "iphone",
"size" : "29x29", "size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-58.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"idiom" : "iphone",
"size" : "29x29", "size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-87.png",
"scale" : "3x" "scale" : "3x"
}, },
{ {
"idiom" : "iphone",
"size" : "40x40", "size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-80.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"idiom" : "iphone",
"size" : "40x40", "size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-121.png",
"scale" : "3x" "scale" : "3x"
}, },
{ {
"idiom" : "iphone",
"size" : "60x60", "size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-120.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"idiom" : "iphone",
"size" : "60x60", "size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-180.png",
"scale" : "3x" "scale" : "3x"
}, },
{ {
"idiom" : "ipad",
"size" : "20x20", "size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-20.png",
"scale" : "1x" "scale" : "1x"
}, },
{ {
"idiom" : "ipad",
"size" : "20x20", "size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-41.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"idiom" : "ipad",
"size" : "29x29", "size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-29.png",
"scale" : "1x" "scale" : "1x"
}, },
{ {
"idiom" : "ipad",
"size" : "29x29", "size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-59.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"idiom" : "ipad",
"size" : "40x40", "size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-42.png",
"scale" : "1x" "scale" : "1x"
}, },
{ {
"idiom" : "ipad",
"size" : "40x40", "size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-81.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"idiom" : "ipad",
"size" : "76x76", "size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-76.png",
"scale" : "1x" "scale" : "1x"
}, },
{ {
"idiom" : "ipad",
"size" : "76x76", "size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-152.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"idiom" : "ipad",
"size" : "83.5x83.5", "size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-167.png",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"idiom" : "ios-marketing",
"size" : "1024x1024", "size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-1024.png",
"scale" : "1x" "scale" : "1x"
} }
], ],

Binary file not shown.

After

Width:  |  Height:  |  Size: 436 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

View 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"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 833 KiB

View 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"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View 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"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View 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"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View 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"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -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>

View File

@@ -1,24 +1,504 @@
<?xml version="1.0" encoding="UTF-8"?> <?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> <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="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<scenes> <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"> <scene sceneID="tne-QT-ifu">
<objects> <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"> <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"/> <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"/> <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"/> <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view> </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> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects> </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> </scene>
</scenes> </scenes>
<resources>
<image name="star" width="512" height="512"/>
</resources>
<color key="tintColor" white="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</document> </document>

View 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)")
}
}
})
}
}

View 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 {
}

View 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?
}

View 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 {
}

View 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)
}

View 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 {
}

View 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?
}

View 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 {
}

View 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?
}

View 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 {
}

View 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)
}

View 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 {
}

View 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?
}

View File

@@ -4,6 +4,8 @@
<dict> <dict>
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string> <string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Zockerhöhle</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string> <string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
@@ -20,6 +22,11 @@
<string>1</string> <string>1</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true/> <true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>UILaunchStoryboardName</key> <key>UILaunchStoryboardName</key>
<string>LaunchScreen</string> <string>LaunchScreen</string>
<key>UIMainStoryboardFile</key> <key>UIMainStoryboardFile</key>

View 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>

View 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)
}
}

View 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)
}
}
}

View 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)
}
}
}

View 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"
}
}

View 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
}
}

View 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
}
}

View 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"
}

View 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
}
}
}

View 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()
}
}

View File

@@ -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.
}
}

View 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))
}
}

View File

@@ -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)
}
}

View 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
}
}

View 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])
}
}

View 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))
}
}

View 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"
}*/
}

View 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

View 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()
}
}
}

View 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"
}
}
}

View 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

View File

@@ -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>

View File

@@ -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>

View File

@@ -0,0 +1 @@