DEV Community

Avelyn Hyunjeong Choi
Avelyn Hyunjeong Choi

Posted on

ToDoApp with watchOS in Swift

Two types of application

  • standalone watch app
  • companion app (integrate with iPhone app)

1.create a watchOS App
create a watchOS App

Image description

2.write ToDo Model in swift file
// ToDo.swift

import Foundation

struct ToDo: Identifiable {
    let id: UUID
    var title: String

    init(title: String) {
        self.id = UUID()
        self.title = title
    }
}
Enter fullscreen mode Exit fullscreen mode

3.write view in swiftUI file
// AddToDoView

import SwiftUI

struct AddToDoView: View {
    @Binding var todos: [ToDo]
    @State private var newToDoTitle = ""
    // injects presentationmode environment value (property wrapper)
    @Environment(\.presentationMode) var presentationMode

    var body: some View {
        VStack {
            TextField("Enter todo", text: $newToDoTitle)
                .padding()

            Button("Done") {
                if(!newToDoTitle.isEmpty) {
                    let newToDo = ToDo(title: newToDoTitle)
                    todos.append(newToDo)
                }
                // dismiss after new item is added to the array -> returns to the main view
                // this value has state of presentationMode
                // dismiss: take off the view from the screen. close the current view
                presentationMode.wrappedValue.dismiss()
            }
            .padding()
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

4.write a main, ContentView

import SwiftUI

struct ContentView: View {
    // create an array of todos
    @State private var todos = [
        ToDo(title: "Buy groceries"),
        ToDo(title: "Email John"),
    ]

    // based on this value -> we will either show or don't show the list
    @State private var showingAddToDoView = false

    var body: some View {
        ZStack(alignment: .bottom) { // .bottom -> push button on the bottom
            List {
                ForEach(todos) { todo in
                    Text(todo.title)
                }.onDelete(perform: delete) // takes a delete function
            }

            Button(action: {
                self.showingAddToDoView.toggle() // toggle the boolean (true -> false)
            }) {
                Image(systemName: "plus")
                    .resizable()
                    .frame(width: 20, height: 20)
                    .foregroundColor(.white)
                    .padding()
                    .background(Color.blue)
                    .clipShape(Circle())
            }
            .buttonStyle(.plain) // remove the gray area surrounding the button
            .sheet(isPresented: $showingAddToDoView) { // when it's true -> present AddToDoView()
                AddToDoView(todos: self.$todos)
            }
        }
    }

    // implement delete function
    private func delete(at offsets: IndexSet) {
        todos.remove(atOffsets: offsets)
    }
}
Enter fullscreen mode Exit fullscreen mode

5.demo

Clicks + button to add a new to do item
Image description

Add a new to do item
Image description

Redirected to main once done
Image description

Sentry blog image

The countdown to March 31 is on.

Make the switch from app center suck less with Sentry.

Read more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay