Post

Replies

Boosts

Views

Activity

Reply to list isn't updating when I add a new item
I got the solution. Changes to MainView: struct MainView: View { // Create your expenses object in the main view @StateObject var expenses = Expenses() // This is necessary for switching between tabs @State var selectedTab = 0 var body: some View { // Use selection initializer for TabView TabView(selection: $selectedTab) { ContentView() .tabItem { Image(systemName: "1.lane") Text("One") } // we assign tag to programmatically switch between tabs .tag(1) // Also we pass selectedTab to AddView so that we can go back to ContentView programmatically AddView(selectedTab: $selectedTab) .tabItem { Image(systemName: "2.lane") Text("Two") } // we assign tag to programmatically switch between tabs .tag(2) } // Inject expenses object into environment so that ContentView and AddView can access it .environmentObject(expenses) } } Changes to ContentView: struct ContentView: View { // This is how we can access expenses object in the environment @EnvironmentObject var expenses: Expenses var body: some View { NavigationView { List { ForEach(expenses.items, id: \.id) { item in HStack { VStack(alignment: .leading) { {....same......} // Pay attention that you need to add .environmentObject in previews to make it work struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() .environmentObject(Expenses()) } } Changes to AddView: struct AddView: View { // This is how we can access expenses object in the environment @EnvironmentObject var expenses: Expenses @State private var name = "" @State private var type = "personal" @State private var amount = 0.0 // Here we pass selectedTab binding @Binding var selectedTab: Int let types = ["Business", "Personal"] @Environment(\.dismiss) var dismiss var body: some View { NavigationView { Form { TextField("name", text: $name) Picker("Type", selection: $type) { ForEach(types, id: \.self) { Text($0) } } TextField("Amount", value: $amount, format: .currency(code: Locale.current.currency?.identifier ?? "BD")) .keyboardType(.decimalPad) } .navigationTitle("Add new expense") .toolbar { Button("Save") { let item = ExpenseItem(name: name, type: type, amount: amount) expenses.items.append(item) // This is how we jump back to ContentView upon pressing save selectedTab = 1 } } } } } // Pay attention that you need to add .environmentObject in previews to make it work struct AddView_Previews: PreviewProvider { static var previews: some View { AddView(selectedTab: .constant(2)) .environmentObject(Expenses()) } } I got it from : https://www.hackingwithswift.com/forums/swiftui/list-isn-t-updating-when-i-add-a-new-item/23977/23981
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Sep ’23
Reply to list isn't updating when I add a new item
Hi @Claude31 struct ContentView: View { @StateObject var expenses = Expenses() var body: some View { NavigationView { List { ForEach(expenses.items, id: \.id) { item in HStack { VStack(alignment: .leading) { Text(item.name) .font(.headline) Text(item.type) } Spacer() Text(item.amount, format: .currency(code: Locale.current.currency?.identifier ?? "BD")) .foregroundColor(item.amount <= 10 ? .green : item.amount <= 100 ? .orange : .red) } } .onDelete(perform: removeItem) Add item code in AddView: Button("Save") { let item = ExpenseItem(name: name, type: type, amount: amount) expenses.items.append(item) }
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Sep ’23
Reply to List not updated after adding a new item
I add item from this view : struct InvoiceView: View { @StateObject var itemsData = ItemsData() @AppStorage("storeName") private var storeName = "" @AppStorage("invoiceNumber") private var invoiceNumber = "" @AppStorage("contactNumber") private var contactNumber = "" @State private var invoiceDate = Date() @AppStorage("customerName") private var customerName = "" @AppStorage("customerAddress") private var customerAddress = "" @AppStorage("cusContactNumber") private var cusContactNumber = "" @State private var showingAddItem = false @State private var showingHistoryView = false // FOR CALCULATE TOTAL AMOUNT. private var totalAmount: Double { itemsData.items.reduce(0.0) { partialResult, item in partialResult + item.price // also can be expressed as { $0 + $1.amount } } } // FOR CALCULATE DISCOUNT AMOUNT. (READING FROM AddView) private var discountAmount: Double { itemsData.items.reduce(0.0) { partialResult, item in partialResult + item.discountAmount // also can be expressed as { $0 + $1.amount } } } // FOR CALCULATE VAT AMOUNT. private var vatAmount1: Double { itemsData.items.reduce(0.0) { partialResult, item in if item.vat > 0 { let netAmount = item.price / (1 + item.vat/100) let vatamount = item.price - netAmount return partialResult + vatamount } return partialResult } } @State private var paymentM = "Cash" let paymentsList = ["Cash", "BenefitPay", "Debit Card"] @ObservedObject var historyData: historyData @State private var type = "Income" @ObservedObject var expenses: Expenses var body: some View { NavigationView { List { Section(header: Text("Store Details")) { TextField("Store Name", text: $storeName) TextField("Invoice number", text: $invoiceNumber) TextField("contact number", text: $contactNumber) } Section{ DatePicker("Date", selection: $invoiceDate) } Section(header: Text("Customer Details")) { TextField("Customer Name", text: $customerName) TextField("Customer Address", text: $customerAddress) TextField("contact number", text: $cusContactNumber) } Group { Button{ showingAddItem = true } label: { HStack { Image(systemName: "plus") Text("Add Item") } } .sheet(isPresented: $showingAddItem) { AddView(ItemsData: itemsData) } ForEach(itemsData.items, id: \.id) { item in HStack { VStack(alignment: .leading) { Text(item.name) .lineLimit(3) Text("x\(item.quantity.formatted())") .foregroundColor(Color("grayed")) } Spacer() VStack { Text(item.price, format: .currency(code: Locale.current.currency?.identifier ?? "BD")) .lineLimit(3) } } } .onDelete(perform: removeItem) } HStack { Text("Discount amount") Spacer() Text("\(discountAmount.formatted(.currency(code: Locale.current.currency?.identifier ?? "BD")))") .foregroundColor(.blue) } HStack { Text("VAT amount") Spacer() Text("\(vatAmount1.formatted(.currency(code: Locale.current.currency?.identifier ?? "BD")))") .foregroundColor(.red) } HStack { VStack(alignment: .leading) { Text("Total") Text(vatAmount1 > 0 ? "inc. VAT" : "") .foregroundColor(Color("grayed")) } Spacer() Text("\(totalAmount.formatted(.currency(code: Locale.current.currency?.identifier ?? "BD")))") .foregroundColor(.green) } Group { Section { Picker("payment method", selection: $paymentM) { ForEach(paymentsList, id: \.self) { Text($0) } } } } } .navigationTitle("Invoice Maker") .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItemGroup { ShareLink("Export PDF", item: render()) Button("Save") { let income = ExpenseItem(name: customerName, type: type, amount: totalAmount - vatAmount1, date: invoiceDate, vat: vatAmount1) expenses.items.insert(income, at: 0) let item = HistoryData(storN: storeName, storNum: contactNumber, invNum: invoiceNumber, dat: invoiceDate, cus: customerName, cusAddr: customerAddress, cusNum: cusContactNumber, price: totalAmount) historyData.item.insert(item, at: 0) } }
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Sep ’23
Reply to Unable to Add for Review - Xcode 15.0.1 - New apps and app updates must be built with the public (GM) versions of Xcode 11 or later
Downgrade to Xcode 15.0
Replies
Boosts
Views
Activity
Nov ’23
Reply to Unable to Add for Review - Xcode 15.0.1 - New apps and app updates must be built with the public (GM) versions of Xcode 11 or later
Same issue using Xcode 15.0.1
Replies
Boosts
Views
Activity
Nov ’23
Reply to How to set text position for all screen sizes in SwiftUI?
This screenshot of iPhone 14 pro
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
Oct ’23
Reply to list isn't updating when I add a new item
I got the solution. Changes to MainView: struct MainView: View { // Create your expenses object in the main view @StateObject var expenses = Expenses() // This is necessary for switching between tabs @State var selectedTab = 0 var body: some View { // Use selection initializer for TabView TabView(selection: $selectedTab) { ContentView() .tabItem { Image(systemName: "1.lane") Text("One") } // we assign tag to programmatically switch between tabs .tag(1) // Also we pass selectedTab to AddView so that we can go back to ContentView programmatically AddView(selectedTab: $selectedTab) .tabItem { Image(systemName: "2.lane") Text("Two") } // we assign tag to programmatically switch between tabs .tag(2) } // Inject expenses object into environment so that ContentView and AddView can access it .environmentObject(expenses) } } Changes to ContentView: struct ContentView: View { // This is how we can access expenses object in the environment @EnvironmentObject var expenses: Expenses var body: some View { NavigationView { List { ForEach(expenses.items, id: \.id) { item in HStack { VStack(alignment: .leading) { {....same......} // Pay attention that you need to add .environmentObject in previews to make it work struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() .environmentObject(Expenses()) } } Changes to AddView: struct AddView: View { // This is how we can access expenses object in the environment @EnvironmentObject var expenses: Expenses @State private var name = "" @State private var type = "personal" @State private var amount = 0.0 // Here we pass selectedTab binding @Binding var selectedTab: Int let types = ["Business", "Personal"] @Environment(\.dismiss) var dismiss var body: some View { NavigationView { Form { TextField("name", text: $name) Picker("Type", selection: $type) { ForEach(types, id: \.self) { Text($0) } } TextField("Amount", value: $amount, format: .currency(code: Locale.current.currency?.identifier ?? "BD")) .keyboardType(.decimalPad) } .navigationTitle("Add new expense") .toolbar { Button("Save") { let item = ExpenseItem(name: name, type: type, amount: amount) expenses.items.append(item) // This is how we jump back to ContentView upon pressing save selectedTab = 1 } } } } } // Pay attention that you need to add .environmentObject in previews to make it work struct AddView_Previews: PreviewProvider { static var previews: some View { AddView(selectedTab: .constant(2)) .environmentObject(Expenses()) } } I got it from : https://www.hackingwithswift.com/forums/swiftui/list-isn-t-updating-when-i-add-a-new-item/23977/23981
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
Sep ’23
Reply to list isn't updating when I add a new item
Hi @Claude31 struct ContentView: View { @StateObject var expenses = Expenses() var body: some View { NavigationView { List { ForEach(expenses.items, id: \.id) { item in HStack { VStack(alignment: .leading) { Text(item.name) .font(.headline) Text(item.type) } Spacer() Text(item.amount, format: .currency(code: Locale.current.currency?.identifier ?? "BD")) .foregroundColor(item.amount <= 10 ? .green : item.amount <= 100 ? .orange : .red) } } .onDelete(perform: removeItem) Add item code in AddView: Button("Save") { let item = ExpenseItem(name: name, type: type, amount: amount) expenses.items.append(item) }
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
Sep ’23
Reply to List not updated after adding a new item
I add item from this view : struct InvoiceView: View { @StateObject var itemsData = ItemsData() @AppStorage("storeName") private var storeName = "" @AppStorage("invoiceNumber") private var invoiceNumber = "" @AppStorage("contactNumber") private var contactNumber = "" @State private var invoiceDate = Date() @AppStorage("customerName") private var customerName = "" @AppStorage("customerAddress") private var customerAddress = "" @AppStorage("cusContactNumber") private var cusContactNumber = "" @State private var showingAddItem = false @State private var showingHistoryView = false // FOR CALCULATE TOTAL AMOUNT. private var totalAmount: Double { itemsData.items.reduce(0.0) { partialResult, item in partialResult + item.price // also can be expressed as { $0 + $1.amount } } } // FOR CALCULATE DISCOUNT AMOUNT. (READING FROM AddView) private var discountAmount: Double { itemsData.items.reduce(0.0) { partialResult, item in partialResult + item.discountAmount // also can be expressed as { $0 + $1.amount } } } // FOR CALCULATE VAT AMOUNT. private var vatAmount1: Double { itemsData.items.reduce(0.0) { partialResult, item in if item.vat > 0 { let netAmount = item.price / (1 + item.vat/100) let vatamount = item.price - netAmount return partialResult + vatamount } return partialResult } } @State private var paymentM = "Cash" let paymentsList = ["Cash", "BenefitPay", "Debit Card"] @ObservedObject var historyData: historyData @State private var type = "Income" @ObservedObject var expenses: Expenses var body: some View { NavigationView { List { Section(header: Text("Store Details")) { TextField("Store Name", text: $storeName) TextField("Invoice number", text: $invoiceNumber) TextField("contact number", text: $contactNumber) } Section{ DatePicker("Date", selection: $invoiceDate) } Section(header: Text("Customer Details")) { TextField("Customer Name", text: $customerName) TextField("Customer Address", text: $customerAddress) TextField("contact number", text: $cusContactNumber) } Group { Button{ showingAddItem = true } label: { HStack { Image(systemName: "plus") Text("Add Item") } } .sheet(isPresented: $showingAddItem) { AddView(ItemsData: itemsData) } ForEach(itemsData.items, id: \.id) { item in HStack { VStack(alignment: .leading) { Text(item.name) .lineLimit(3) Text("x\(item.quantity.formatted())") .foregroundColor(Color("grayed")) } Spacer() VStack { Text(item.price, format: .currency(code: Locale.current.currency?.identifier ?? "BD")) .lineLimit(3) } } } .onDelete(perform: removeItem) } HStack { Text("Discount amount") Spacer() Text("\(discountAmount.formatted(.currency(code: Locale.current.currency?.identifier ?? "BD")))") .foregroundColor(.blue) } HStack { Text("VAT amount") Spacer() Text("\(vatAmount1.formatted(.currency(code: Locale.current.currency?.identifier ?? "BD")))") .foregroundColor(.red) } HStack { VStack(alignment: .leading) { Text("Total") Text(vatAmount1 > 0 ? "inc. VAT" : "") .foregroundColor(Color("grayed")) } Spacer() Text("\(totalAmount.formatted(.currency(code: Locale.current.currency?.identifier ?? "BD")))") .foregroundColor(.green) } Group { Section { Picker("payment method", selection: $paymentM) { ForEach(paymentsList, id: \.self) { Text($0) } } } } } .navigationTitle("Invoice Maker") .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItemGroup { ShareLink("Export PDF", item: render()) Button("Save") { let income = ExpenseItem(name: customerName, type: type, amount: totalAmount - vatAmount1, date: invoiceDate, vat: vatAmount1) expenses.items.insert(income, at: 0) let item = HistoryData(storN: storeName, storNum: contactNumber, invNum: invoiceNumber, dat: invoiceDate, cus: customerName, cusAddr: customerAddress, cusNum: cusContactNumber, price: totalAmount) historyData.item.insert(item, at: 0) } }
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
Sep ’23