0% found this document useful (0 votes)
10 views5 pages

Ammm

Uploaded by

amohamedakil9
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
10 views5 pages

Ammm

Uploaded by

amohamedakil9
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 5

import Foundation

import SwiftUI
import CoreData

struct ContentView: View {


@Environment(\.managedObjectContext) private var viewContext

@FetchRequest(entity: Time.entity(), sortDescriptors: [])


private var times: FetchedResults<Time>

@State var startstop: String = "Start"


@State var start: Bool = false
@State var elapsedTime: Int = 0
@State var timeMinutes: Int = 0
@State var timeSeconds: Int = 0
@State var timeMilliseconds: Int = 0
@State var hour: Int = 0
@State var minute: Int = 0
@State var second: Int = 0
@State var formattedTime: String = ""
@State var saveTime: Int = 0
@State var timerRunning: Bool = true
@State var firstRun: Bool = true
// Format date after core data fetch to allow creating NSSortDescript for date
var body: some View {
VStack{
Text("Cube App")
.font(.largeTitle)
.fontWeight(.bold)
.padding(.top, 4.0)
Text(scrambles.randomElement()!)
.font(.title)
.fontWeight(.semibold)
.multilineTextAlignment(.center)
.padding([.top, .leading, .trailing])
if start{
Stopwatch(progressTime: $elapsedTime, isRunning: $timerRunning)
.padding(.top)
.fontWeight(.bold)
.onAppear{
timerRunning = true
toggleStartStop()
}
}

Button(startstop){
toggleStart()
if start == false{
saveTime = elapsedTime
stopTime()
elapsedTime = 0
toggleStartStop()
}
}
.fontWeight(.bold)
.font(.system(size: 30))
.padding(.top, 30)
Spacer()
}
}

private func stopTime(){


timerRunning = false
print(saveTime)
addTime()
}

private func addTime(){


withAnimation{
timeMinutes = saveTime / 6000
timeSeconds = (saveTime % 6000) / 100
timeMilliseconds = saveTime % 100
let time = Time(context: viewContext)
if timeMinutes == 0{
if timeMilliseconds < 10{
time.time = "\(timeSeconds).0\(timeMilliseconds)"
}else{
time.time = "\(timeSeconds).\(timeMilliseconds)"
}
}else if timeMilliseconds < 10{
if timeSeconds < 10{
time.time = "\(timeMinutes):0\(timeSeconds).0\
(timeMilliseconds)"
}else{
time.time = "\(timeMinutes):\(timeSeconds).0\
(timeMilliseconds)"
}
}else{
if timeSeconds < 10{
time.time = "\(timeMinutes):0\(timeSeconds).\
(timeMilliseconds)"
}else{
time.time = "\(timeMinutes):\(timeSeconds).\(timeMilliseconds)"
}
}
time.date = Date()

saveContext()
}
}

private func saveContext(){


do {
try viewContext.save()
} catch {
let error = error as NSError
print(error)
fatalError(error as! String)
}
}

private func toggleStart(){


if start{
start = false
}else{
start = true
}
}
private func toggleStartStop(){
if startstop == "Start"{
startstop = "Stop"
}else{
startstop = "Start"
}
}
}

struct ContentView_Previews: PreviewProvider {


static var previews: some View {
let persistenceController = PersistenceController.shared
ContentView().environment(\.managedObjectContext,
persistenceController.container.viewContext)
}
}
Note: I have excluded the array of "scrambles" as it went over the character limit,
but it is only used in a text in the vstack. The code for the Stopwatch (Timer)
file is:
import SwiftUI

struct Stopwatch: View {


@Binding var progressTime: Int
@Binding var isRunning: Bool
/// Computed properties to get the progressTime in hh:mm:ss format
var hours: Int {
progressTime / 6000
}

var minutes: Int {


(progressTime % 6000) / 100
}

var seconds: Int {


progressTime % 100
}

var timer: Timer {


Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) {_ in
progressTime += 1
reset()
}
}

var body: some View {


HStack(spacing: 2) {
StopwatchUnitView(timeUnit: hours)
Text(":")
StopwatchUnitView(timeUnit: minutes)
Text(".")
StopwatchUnitView(timeUnit: seconds)
}.onAppear(perform: { _ = timer })
}
func reset(){
if isRunning == false{
self.timer.invalidate()
print("invailidated")
}
}
func toggleRun(){
if isRunning{
isRunning = false
progressTime = 0
print(isRunning)
timer.invalidate()
}else{
isRunning = true
}
}
func fetchTime() -> Int{
return progressTime
}
}

struct StopwatchUnitView: View {

var timeUnit: Int

/// Time unit expressed as String.


/// - Includes "0" as prefix if this is less than 10
var timeUnitStr: String {
let timeUnitStr = String(timeUnit)
return timeUnit < 10 ? "0" + timeUnitStr : timeUnitStr
}

var body: some View {


HStack (spacing: 2) {
Text(timeUnitStr.substring(index: 0)).frame(width: 10)
Text(timeUnitStr.substring(index: 1)).frame(width: 10)
}
}
}

extension String {
func substring(index: Int) -> String {
let arrayString = Array(self)
return String(arrayString[index])
}
}

struct stopwatch_Previews: PreviewProvider {


static var previews: some View {
Stopwatch(progressTime:.constant(0), isRunning: .constant(true) /*firstRun:
.constant(true)*/)
}
}

UITapGestureRecognizer *doubleTapGestureRecognizer = [[UITapGestureRecognizer


alloc]
initWithTarget:self
action:@selector(handleDoubleTap:)];
doubleTapGestureRecognizer.numberOfTapsRequired = 2;

//tapGestureRecognizer.delegate = self;
[self addGestureRecognizer:doubleTapGestureRecognizer];
//
UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer
alloc] initWithTarget:self action:@selector(handleSingleTap:)];
singleTapGestureRecognizer.numberOfTapsRequired = 1;

[singleTapGestureRecognizer requireGestureRecognizerToFail:
doubleTapGestureRecognizer];
//tapGestureRecognizer.delegate = self;
[self addGestureRecognizer:singleTapGestureRecognizer];

UITapGestureRecognizer *doubleTapGestureRecognizer = [[UITapGestureRecognizer


alloc]
initWithTarget:self
action:@selector(handleDoubleTap:)];
doubleTapGestureRecognizer.numberOfTapsRequired = 2;

//tapGestureRecognizer.delegate = self;
[self addGestureRecognizer:doubleTapGestureRecognizer];

//
UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer
alloc] initWithTarget:self action:@selector(handleSingleTap:)];
singleTapGestureRecognizer.numberOfTapsRequired = 1;

[singleTapGestureRecognizer requireGestureRecognizerToFail:
doubleTapGestureRecognizer];
//tapGestureRecognizer.delegate = self;
[self addGestureRecognizer:singleTapGestureRecognizer];

UITapGestureRecognizer *doubleTapGestureRecognizer = [[UITapGestureRecognizer


alloc]
initWithTarget:self
action:@selector(handleDoubleTap:)];
doubleTapGestureRecognizer.numberOfTapsRequired = 2;

//tapGestureRecognizer.delegate = self;
[self addGestureRecognizer:doubleTapGestureRecognizer];

//
UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer
alloc] initWithTarget:self action:@selector(handleSingleTap:)];
singleTapGestureRecognizer.numberOfTapsRequired = 1;

[singleTapGestureRecognizer requireGestureRecognizerToFail:
doubleTapGestureRecognizer];
//tapGestureRecognizer.delegate = self;
[self addGestureRecognizer:singleTapGestureRecognizer];

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy