Skip to content
Snippets Groups Projects
Commit 7572278f authored by Jehu Ombrog's avatar Jehu Ombrog
Browse files

Add all my files

parent 6f4bd988
No related branches found
No related tags found
No related merge requests found
...@@ -13,6 +13,10 @@ ...@@ -13,6 +13,10 @@
615AC3FC2C764237009924FB /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 615AC3FB2C764237009924FB /* Base */; }; 615AC3FC2C764237009924FB /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 615AC3FB2C764237009924FB /* Base */; };
615AC3FE2C764238009924FB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 615AC3FD2C764238009924FB /* Assets.xcassets */; }; 615AC3FE2C764238009924FB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 615AC3FD2C764238009924FB /* Assets.xcassets */; };
615AC4012C764238009924FB /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 615AC4002C764238009924FB /* Base */; }; 615AC4012C764238009924FB /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 615AC4002C764238009924FB /* Base */; };
615AC40B2C764562009924FB /* productDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615AC40A2C764562009924FB /* productDetails.swift */; };
615AC40F2C764721009924FB /* productAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615AC40E2C764721009924FB /* productAPI.swift */; };
615AC4122C7663AD009924FB /* CustomTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 615AC4102C7663AD009924FB /* CustomTableViewCell.swift */; };
618005D72C76ED5B00E07B3E /* SecondViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618005D62C76ED5B00E07B3E /* SecondViewController.swift */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
...@@ -24,6 +28,10 @@ ...@@ -24,6 +28,10 @@
615AC3FD2C764238009924FB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 615AC3FD2C764238009924FB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
615AC4002C764238009924FB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 615AC4002C764238009924FB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
615AC4022C764238009924FB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 615AC4022C764238009924FB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
615AC40A2C764562009924FB /* productDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = productDetails.swift; sourceTree = "<group>"; };
615AC40E2C764721009924FB /* productAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = productAPI.swift; sourceTree = "<group>"; };
615AC4102C7663AD009924FB /* CustomTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTableViewCell.swift; sourceTree = "<group>"; };
618005D62C76ED5B00E07B3E /* SecondViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondViewController.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
...@@ -56,10 +64,12 @@ ...@@ -56,10 +64,12 @@
615AC3F32C764237009924FB /* shop2 */ = { 615AC3F32C764237009924FB /* shop2 */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
618005DB2C770F6500E07B3E /* Controller */,
618005DA2C770F5000E07B3E /* View */,
618005D82C770F4000E07B3E /* Model */,
615AC3F42C764237009924FB /* AppDelegate.swift */, 615AC3F42C764237009924FB /* AppDelegate.swift */,
615AC3F62C764237009924FB /* SceneDelegate.swift */, 615AC3F62C764237009924FB /* SceneDelegate.swift */,
615AC3F82C764237009924FB /* ViewController.swift */, 615AC3F82C764237009924FB /* ViewController.swift */,
615AC3FA2C764237009924FB /* Main.storyboard */,
615AC3FD2C764238009924FB /* Assets.xcassets */, 615AC3FD2C764238009924FB /* Assets.xcassets */,
615AC3FF2C764238009924FB /* LaunchScreen.storyboard */, 615AC3FF2C764238009924FB /* LaunchScreen.storyboard */,
615AC4022C764238009924FB /* Info.plist */, 615AC4022C764238009924FB /* Info.plist */,
...@@ -67,6 +77,40 @@ ...@@ -67,6 +77,40 @@
path = shop2; path = shop2;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
618005D82C770F4000E07B3E /* Model */ = {
isa = PBXGroup;
children = (
615AC40A2C764562009924FB /* productDetails.swift */,
);
path = Model;
sourceTree = "<group>";
};
618005DA2C770F5000E07B3E /* View */ = {
isa = PBXGroup;
children = (
615AC3FA2C764237009924FB /* Main.storyboard */,
);
path = View;
sourceTree = "<group>";
};
618005DB2C770F6500E07B3E /* Controller */ = {
isa = PBXGroup;
children = (
615AC4102C7663AD009924FB /* CustomTableViewCell.swift */,
618005D62C76ED5B00E07B3E /* SecondViewController.swift */,
618005DC2C770F7400E07B3E /* API */,
);
path = Controller;
sourceTree = "<group>";
};
618005DC2C770F7400E07B3E /* API */ = {
isa = PBXGroup;
children = (
615AC40E2C764721009924FB /* productAPI.swift */,
);
path = API;
sourceTree = "<group>";
};
/* End PBXGroup section */ /* End PBXGroup section */
/* Begin PBXNativeTarget section */ /* Begin PBXNativeTarget section */
...@@ -138,8 +182,12 @@ ...@@ -138,8 +182,12 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
615AC4122C7663AD009924FB /* CustomTableViewCell.swift in Sources */,
615AC40F2C764721009924FB /* productAPI.swift in Sources */,
615AC3F92C764237009924FB /* ViewController.swift in Sources */, 615AC3F92C764237009924FB /* ViewController.swift in Sources */,
615AC3F52C764237009924FB /* AppDelegate.swift in Sources */, 615AC3F52C764237009924FB /* AppDelegate.swift in Sources */,
618005D72C76ED5B00E07B3E /* SecondViewController.swift in Sources */,
615AC40B2C764562009924FB /* productDetails.swift in Sources */,
615AC3F72C764237009924FB /* SceneDelegate.swift in Sources */, 615AC3F72C764237009924FB /* SceneDelegate.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
......
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<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="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>
//
// productAPI.swift
// shop2
//
// Created by Jehu Ombrog on 8/22/24.
//
import Foundation
class productController{
func fetchProductDetails() async throws -> [productDetails] {
let urlString = "https://fakestoreapi.com/products"
guard let url = URL(string:urlString) else { return [] } // to check that url must have value
do{
let (data , _) = try await URLSession.shared.data(from: url)
let productList = try JSONDecoder().decode([productDetails].self, from: data)
return productList
}catch{
print("DEBUG: Error \(error.localizedDescription)")
return []
}
}
}
//
// CustomTableViewCell.swift
// shop2
//
// Created by Jehu Ombrog on 8/22/24.
//
import UIKit
class CustomTableViewCell: UITableViewCell {
@IBOutlet var productName : UILabel!
@IBOutlet var productPrice : UILabel!
@IBOutlet var producImage : UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
//
// SecondViewController.swift
// shop2
//
// Created by Jehu Ombrog on 8/22/24.
//
import UIKit
class SecondViewController: UIViewController {
@IBOutlet weak var productName : UILabel!
@IBOutlet weak var productPrice : UILabel!
@IBOutlet weak var productImage : UIImageView!
var img : UIImage? {
didSet {
productImage.image = img
}
}
var lblName = ""
var lblPrice = ""
override func viewDidLoad() {
super.viewDidLoad()
productName.text = lblName
productPrice.text = lblPrice
// Do any additional setup after loading the view.
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/
}
//
// productDetails.swift
// shop2
//
// Created by Jehu Ombrog on 8/21/24.
//
import Foundation
struct productDetails: Codable, Identifiable{
var id: Int
var title: String
var price: Double
var image: String
var description: String
var category: String
}
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="PNW-T3-Tjy">
<device id="retina6_72" orientation="portrait" appearance="light"/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" customModule="shop2" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="430" height="932"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="mW4-X5-ZnP">
<rect key="frame" x="0.0" y="103" width="430" height="795"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="CustomTableViewCell" rowHeight="125" id="Uss-Jf-ehf" customClass="CustomTableViewCell" customModule="shop2" customModuleProvider="target">
<rect key="frame" x="0.0" y="50" width="430" height="125"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Uss-Jf-ehf" id="xWa-T9-hUP">
<rect key="frame" x="0.0" y="0.0" width="430" height="125"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="F25-4H-xyF">
<rect key="frame" x="10" y="10" width="100" height="100"/>
<constraints>
<constraint firstAttribute="height" constant="100" id="3EM-sT-AS2"/>
<constraint firstAttribute="width" constant="100" id="CrH-7j-zQk"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ATq-0K-GJG">
<rect key="frame" x="120" y="21" width="300" height="18"/>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="15"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="gin-0N-e4L">
<rect key="frame" x="320" y="84.666666666666671" width="80" height="19.333333333333329"/>
<color key="backgroundColor" systemColor="systemRedColor"/>
<constraints>
<constraint firstAttribute="width" constant="80" id="s9L-Si-uh9"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="trailingMargin" secondItem="gin-0N-e4L" secondAttribute="trailing" constant="10" id="GE3-tZ-As2"/>
<constraint firstItem="F25-4H-xyF" firstAttribute="leading" secondItem="xWa-T9-hUP" secondAttribute="leading" constant="10" id="Vh6-o0-cmV"/>
<constraint firstItem="F25-4H-xyF" firstAttribute="top" secondItem="xWa-T9-hUP" secondAttribute="top" constant="10" id="aeY-LM-e86"/>
<constraint firstItem="ATq-0K-GJG" firstAttribute="top" secondItem="xWa-T9-hUP" secondAttribute="topMargin" constant="10" id="arj-Cx-ApM"/>
<constraint firstItem="ATq-0K-GJG" firstAttribute="leading" secondItem="F25-4H-xyF" secondAttribute="trailing" constant="10" id="qPL-xG-nF5"/>
<constraint firstAttribute="bottomMargin" secondItem="gin-0N-e4L" secondAttribute="bottom" constant="10" id="vhq-ao-bVP"/>
<constraint firstAttribute="trailing" secondItem="ATq-0K-GJG" secondAttribute="trailing" constant="10" id="wCZ-7y-mq0"/>
</constraints>
</tableViewCellContentView>
<connections>
<outlet property="producImage" destination="F25-4H-xyF" id="vA5-86-Wfy"/>
<outlet property="productName" destination="ATq-0K-GJG" id="bpn-7Y-R11"/>
<outlet property="productPrice" destination="gin-0N-e4L" id="vT6-OE-ioU"/>
</connections>
</tableViewCell>
</prototypes>
</tableView>
</subviews>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="mW4-X5-ZnP" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leading" id="8dH-8k-tLo"/>
<constraint firstItem="mW4-X5-ZnP" firstAttribute="top" secondItem="6Tk-OE-BBY" secondAttribute="top" id="SXV-Wa-eQR"/>
<constraint firstItem="6Tk-OE-BBY" firstAttribute="trailing" secondItem="mW4-X5-ZnP" secondAttribute="trailing" id="tPN-eg-e3N"/>
<constraint firstItem="6Tk-OE-BBY" firstAttribute="bottom" secondItem="mW4-X5-ZnP" secondAttribute="bottom" id="xGV-CX-fea"/>
</constraints>
</view>
<navigationItem key="navigationItem" id="p0V-K0-lme"/>
<connections>
<outlet property="tableView" destination="mW4-X5-ZnP" id="Vh3-ze-Qmc"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="950.23255813953483" y="3.218884120171674"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="XFv-7T-cec">
<objects>
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="PNW-T3-Tjy" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" id="GjD-HL-4I5">
<rect key="frame" x="0.0" y="59" width="430" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
<segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="7gK-FR-pSe"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Xg0-Mz-ERq" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="23.664122137404579" y="3.5211267605633805"/>
</scene>
<!--Product Details-->
<scene sceneID="k5b-nh-uZZ">
<objects>
<viewController storyboardIdentifier="SecondViewController" id="TWg-l6-YWE" customClass="SecondViewController" customModule="shop2" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="GUj-Jp-Qny">
<rect key="frame" x="0.0" y="0.0" width="430" height="932"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="9ZW-KG-i2N">
<rect key="frame" x="115" y="213" width="200" height="200"/>
<constraints>
<constraint firstAttribute="width" constant="200" id="BQD-15-GMq"/>
<constraint firstAttribute="height" constant="200" id="PzM-aO-JLT"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Product Name" textAlignment="center" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="250" translatesAutoresizingMaskIntoConstraints="NO" id="RUe-aa-ICe">
<rect key="frame" x="90" y="453.66666666666669" width="250" height="19.333333333333314"/>
<constraints>
<constraint firstAttribute="width" constant="250" id="b69-cb-NSX"/>
</constraints>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hls-Ox-2vm">
<rect key="frame" x="175" y="502" width="80" height="21"/>
<color key="backgroundColor" systemColor="systemRedColor"/>
<constraints>
<constraint firstAttribute="width" constant="80" id="PpO-l2-pkX"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<viewLayoutGuide key="safeArea" id="EgF-Md-b6Z"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="EgF-Md-b6Z" firstAttribute="trailing" secondItem="9ZW-KG-i2N" secondAttribute="trailing" constant="115" id="5n3-4T-7XX"/>
<constraint firstItem="hls-Ox-2vm" firstAttribute="centerX" secondItem="GUj-Jp-Qny" secondAttribute="centerX" id="HXZ-Hw-Wfr"/>
<constraint firstItem="EgF-Md-b6Z" firstAttribute="trailing" secondItem="RUe-aa-ICe" secondAttribute="trailing" constant="90" id="HZQ-ik-d18"/>
<constraint firstItem="RUe-aa-ICe" firstAttribute="leading" secondItem="EgF-Md-b6Z" secondAttribute="leading" constant="90" id="WEw-d5-53a"/>
<constraint firstItem="hls-Ox-2vm" firstAttribute="bottom" secondItem="RUe-aa-ICe" secondAttribute="bottom" constant="50" id="frt-WE-J3I"/>
<constraint firstItem="RUe-aa-ICe" firstAttribute="bottom" secondItem="9ZW-KG-i2N" secondAttribute="bottom" constant="60" id="hiz-LH-AQY"/>
<constraint firstItem="9ZW-KG-i2N" firstAttribute="leading" secondItem="EgF-Md-b6Z" secondAttribute="leading" constant="115" id="nXN-kU-F8n"/>
<constraint firstItem="9ZW-KG-i2N" firstAttribute="top" secondItem="EgF-Md-b6Z" secondAttribute="top" constant="154" id="tWJ-hf-UuI"/>
</constraints>
</view>
<navigationItem key="navigationItem" title="Product Details" id="UYF-xk-ybG"/>
<connections>
<outlet property="productImage" destination="9ZW-KG-i2N" id="sQM-q3-sJc"/>
<outlet property="productName" destination="RUe-aa-ICe" id="ljD-G4-RFa"/>
<outlet property="productPrice" destination="hls-Ox-2vm" id="dtZ-tR-NTY"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Jcc-TA-f9I" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1707.9069767441861" y="3.8626609442060089"/>
</scene>
</scenes>
<resources>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
<systemColor name="systemRedColor">
<color red="1" green="0.23137254901960785" blue="0.18823529411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
</resources>
</document>
...@@ -7,13 +7,114 @@ ...@@ -7,13 +7,114 @@
import UIKit import UIKit
class ViewController: UIViewController { class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet var tableView : UITableView!
private let productService = productController()
var productList = [productDetails]()
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
// Do any additional setup after loading the view. print("Table view:")
}
tableView.delegate = self
tableView.dataSource = self
Task {
do {
try await fetchProducts()
} catch {
print("Failed to fetch products: \(error)")
}
}
}
func fetchProducts() async throws {
do {
self.productList = try await productService.fetchProductDetails()
navigationItem.title = "Products"
tableView.rowHeight = 120
tableView.reloadData()
} catch {
print("Error fetching products: \(error)")
}
}
private func loadImage(from url: URL, completion: @escaping (UIImage?) -> Void) {
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
print("Error fetching image: \(error)")
completion(nil)
return
}
guard let data = data, let image = UIImage(data: data) else {
completion(nil)
return
}
completion(image)
}
task.resume()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return productList.count
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let vc = storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController{
let product = productList[indexPath.row]
vc.lblName = product.title
vc.lblPrice = String(format: "$%.2f", product.price)
if let imageUrl = URL(string: product.image) {
loadImage(from: imageUrl) { image in
DispatchQueue.main.async {
vc.img = image
print("DEBUG: image link \(product.image)")
print("DEBUG: UIImage \(image)")
}
}
}
self .navigationController?.pushViewController(vc, animated: true)
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath) as! CustomTableViewCell
let product = productList[indexPath.row]
if let imageUrl = URL(string: product.image) {
loadImage(from: imageUrl) { image in
DispatchQueue.main.async {
cell.producImage.image = image
}
}
}
cell.productName.text = product.title
cell.productPrice.text = String(format: "$%.2f", product.price)
return cell
}
} }
extension UIImageView{
func load(url: URL) {
DispatchQueue.global().async { [weak self] in
if let data = try? Data(contentsOf: url){
if let image = UIImage(data: data) {
DispatchQueue.main.async {
self?.image = image
}
}
}
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment