Post

Replies

Boosts

Views

Created

Why list items not able to delete in SwiftUI?
I have a simple app in SwiftUI, and I try to delete list items in app , project is working, but still list items not able to delete, I do not know what I did not put in my codes, any idea will be appreciated. struct MyView: View { @State private var selectedUsers: MyModel? var body: some View { ScrollView(.vertical, showsIndicators: false, content: { VStack(content: { ForEach(datas){ data in MyRowView(data: data) .contextMenu { Button(action: { self.delete(item: data) }) { Text("delete") } } .onTapGesture { selectedUsers = data } } .onDelete { (indexSet) in selectedUsers.remove(atOffsets: indexSet) }}) })} private func delete(item data: MyModel) { if let index = datas.firstIndex(where: { $0.id == data.id }) { datas.remove(at: index) } }} model: struct MyModel: Identifiable, Hashable, Codable { var id = UUID().uuidString var name: String } var datas = [ MyModel(name: "david"), MyModel(name: "marry"), ]
3
0
2k
Feb ’22
How we can delete all list items in SwiftUI?
I have a simple app in SwiftUI, and I try to delete all list items with context menu , when I click context menu button, I want to remove all items, is it possible? struct MyView: View { @State private var selectedUsers: MyModel? var body: some View { ScrollView(.vertical, showsIndicators: false, content: { VStack(content: { ForEach(datas){ data in MyRowView(data: data) .contextMenu { Button(action: { self.delete(item: data) }) { Text("delete") } } .onTapGesture { selectedUsers = data } } .onDelete { (indexSet) in selectedUsers.remove(atOffsets: indexSet) }}) })} private func delete(item data: MyModel) { if let index = datas.firstIndex(where: { $0.id == data.id }) { datas.remove(at: index) } }} model: struct MyModel: Identifiable, Hashable, Codable { var id = UUID().uuidString var name: String } var datas = [ MyModel(name: "david"), MyModel(name: "marry"), ]
2
0
1.7k
Feb ’22
How we can use alert menu before delete list items in SwiftUI?
I have list items in SwiftUI, and when I delete list items I want to delete after alert menu, like "do want to delete your list items, ""yes" or "no" is it possible? struct MyView: View { @State private var selectedUsers: MyModel? var body: some View { ScrollView(.vertical, showsIndicators: false, content: { VStack(content: { ForEach(datas){ data in MyRowView(data: data) .contextMenu { Button(action: { self.delete(item: data) }) { Text("delete") } } .onTapGesture { selectedUsers = data } } .onDelete { (indexSet) in self.datas.remove(atOffsets: indexSet) }}) })} private func delete(item data: MyModel) { if let index = datas.firstIndex(where: { $0.id == data.id }) { datas.remove(at: index) } }}
2
0
2.5k
Feb ’22
How we can use alert menu before delete list items in SwiftUI?
I have list items in SwiftUI, and when I delete list items, but when I click the delete button, it delete item randomly, I want to delete seleted item, where is the mistake? struct MyView: View { @State private var selectedUsers: MyModel?   @State var datas: [MyModel]    @State private var confirmDelete = false var body: some View { ScrollView(.vertical, showsIndicators: false, content: { VStack(content: { ForEach(datas){ data in MyRowView(data: data) .contextMenu { Button(action: { self.delete(item: data) }) { Text("delete") } } .onTapGesture { selectedUsers = data }   .confirmationDialog( "Are you sure ?",                   isPresented: $confirmDelete,                   titleVisibility: .visible                 ){                                       Button(role: .destructive) {                     self.delete(item: data)                   } label: {                     Text("ok")                                         }                   Button(role: .cancel) {                                         } label: {                     Text("cancel")                                         }                 }             } .onDelete { (indexSet) in self.datas.remove(atOffsets: indexSet) }}) })} private func delete(item data: MyModel) { if let index = datas.firstIndex(where: { $0.id == data.id }) { datas.remove(at: index) } }}
1
1
1k
Feb ’22
Why SwiftUI `confirmationDialog` delete the wrong item?
I am trying to use confirmationDialog to delete an item in a List. But what happens is that the wrong item gets deleted. Why? Here is my code: struct MyView: View { @State private var selectedUsers: MyModel?   @State var datas: [MyModel]    @State private var confirmDelete = false var body: some View { ScrollView(.vertical, showsIndicators: false, content: { VStack(content: { ForEach(datas){ data in MyRowView(data: data) .contextMenu { Button(action: { self.delete(item: data) }) { Text("delete") } } .onTapGesture { selectedUsers = data }   .alert(isPresented: $confirmDelete) {               Alert(title: Text("title"),                 message: Text("message"),                 primaryButton: .destructive(Text("Delete")) {                                 self.delete(item: data)                                   },                 secondaryButton: .cancel())             }                               } .onDelete { (indexSet) in self.datas.remove(atOffsets: indexSet) }}) })} private func delete(item data: MyModel) { if let index = datas.firstIndex(where: { $0.id == data.id }) { datas.remove(at: index) } }}
1
1
1k
Feb ’22
How can I use multiple `.alert` dialog in SwiftUI?
I have multiple alert dialog in project, just one of them is work, but I am still do not know why I am not use second one, so how we can use multiple .alert dialog in SwiftUI? struct MyView: View { @State private var selectedUsers: MyModel?   @State var datas: [MyModel]    @State private var deleteRow = false   @State private var deleteRows = false var body: some View { ScrollView(.vertical, showsIndicators: false, content: { VStack(content: { ForEach(datas){ data in MyRowView(data: data) .contextMenu { Button(action: {     deleteRow = true }) { Text("delete") } Button(action: {    deleteRows = true }) { Text("delete") } } .onTapGesture { selectedUsers = data }   .alert(isPresented: $deleteRow) {               Alert(title: Text("title"),                 message: Text("message"),                 primaryButton: .destructive(Text("Delete")) {                                 self.delete(item: data)                                   },                 secondaryButton: .cancel())             }   .alert(isPresented: $deleteRows) {               Alert(title: Text("title"),                 message: Text("message"),                 primaryButton: .destructive(Text("Delete")) {                    self.datas.removeAll()                 },                 secondaryButton: .cancel())             }                               } .onDelete { (indexSet) in self.datas.remove(atOffsets: indexSet) }}) })} private func delete(item data: MyModel) { if let index = datas.firstIndex(where: { $0.id == data.id }) { datas.remove(at: index) } }}
3
1
2.2k
Mar ’22
Why it throw ab error as a "Cannot find 'state' in scope" in SwiftUI project?
I have small SwiftUI app, and it throw an error like "Cannot find 'state' in scope" for this line  Register(state: state) I guess it must be like that, but it is throw an error, I do not know what I missed? Any idea? struct Register: View {       @ObservedObject private var viewModel: RegisterViewModel        init(state: AppState) {    self.viewModel =RegisterViewModel(authAPI: AuthService(), state: state)    }       var body: some View { } } struct Register_Previews: PreviewProvider {       @ObservedObject private var viewModel: RegisterViewModel   @State var pushActive = false        init(state: AppState) {    self.viewModel = RegisterViewModel(authAPI: AuthService(), state: state)    }       static var previews: some View {     Register(state: state)   } } class RegisterViewModel: ObservableObject {     @Published var state: AppState       init(authAPI: AuthAPI, state: AppState) {     self.authAPI = authAPI     self.state = state   }     } }
2
0
960
Mar ’22
Why it says "Function is unused" in SwiftUI?
I have SwiftUI project, and I want to use register for my project, it throw an error as a "Function is unused" for signUp in this line of code: Button {                   self.viewModel.signUp                    } label: {                   Text("Register")                     .padding()                 } I do not know why? struct Register: View {       @ObservedObject private var viewModel: RegisterViewModel   @State var pushActive = false         init(state: AppState) {           self.viewModel = RegisterViewModel(authAPI: AuthService(), state: state)           }     var body: some View {    Button {                              self.viewModel.signUp                                     } label: {                   Text("Register")                     .padding()                                     } } viewmodel: class RegisterViewModel: ObservableObject {   @Published var email: String = ""   @Published var password: String = ""   @Published var state: AppState       private var cancellableBag = Set<AnyCancellable>()   private let authAPI: AuthAPI       init(authAPI: AuthAPI, state: AppState) {     self.authAPI = authAPI     self.state = state   }       func signUp() {     authAPI.signUp(email: email, password: password)       .receive(on: RunLoop.main)       .map(resultMapper)       .store(in: &cancellableBag)   } } }
1
0
4.1k
Mar ’22
Why I am not succes to register in my app in SwiftUI?
I am use firebase for my SwiftUI App, and I want to register with mail, but when I typing my mail it is throw an error like Oops! Something went wrong. Please try again. I do not know why? here is my code: StatusViewModel: class StatusViewModel: Identifiable, ObservableObject {       var title: String   var message: String       init(title: String = "", message: String = "") {     self.title = title     self.message = message   }       static var signUpSuccessStatus: StatusViewModel {     return StatusViewModel(title: "Successful", message: "Your account has been created successfully")   }       static var logInSuccessStatus: StatusViewModel {     return StatusViewModel(title: "Successful", message: "Your account has been logged in successfully")   }       static var errorStatus: StatusViewModel {     return StatusViewModel(title: "Error", message: "Oops! Something went wrong. Please try again.")   } } RegisterViewModel: import Foundation import Combine class RegisterViewModel: ObservableObject {   @Published var email: String = ""   @Published var password: String = ""   @Published var statusViewModel: StatusViewModel?   @Published var state: AppState       private var cancellableBag = Set<AnyCancellable>()   private let authAPI: AuthAPI       init(authAPI: AuthAPI, state: AppState) {     self.authAPI = authAPI     self.state = state   }       func signUp() {     authAPI.signUp(email: email, password: password)       .receive(on: RunLoop.main)       .map(resultMapper)       .replaceError(with: StatusViewModel.errorStatus)       .assign(to: \.statusViewModel, on: self)       .store(in: &cancellableBag)   } } extension RegisterViewModel {   private func resultMapper(with user: User?) -> StatusViewModel {     if user != nil {       state.currentUser = user       return StatusViewModel.signUpSuccessStatus     } else {       return StatusViewModel.errorStatus     }   } } struct Register: View {       @ObservedObject private var viewModel: RegisterViewModel   @State var pushActive = false         init(state: AppState) {           self.viewModel = RegisterViewModel(authAPI: AuthService(), state: state)           }   var body: some View {   NavigationLink(destination: HomeView(state: viewModel.state),                       isActive: self.$pushActive) {                 Button {                              self.viewModel.signUp()                                     } label: {                   Text("Register")                     .padding()                                     }               } } }
0
0
539
Mar ’22
How we can use the multiple register screen in SwiftUI for firebase?
I have multiple register screen in swiftUI, I did not understand how I will connect first register screen to second register screen, normally first register screen connect to main screen, but I want to connect first register screen to second register screen, and connect second register screen to main screen, how can I do it, any idea? StatusViewModel: class StatusViewModel: Identifiable, ObservableObject {       var title: String   var message: String       init(title: String = "", message: String = "") {     self.title = title     self.message = message   }       static var signUpSuccessStatus: StatusViewModel {     return StatusViewModel(title: "Successful", message: "Your account has been created successfully")   }       static var logInSuccessStatus: StatusViewModel {     return StatusViewModel(title: "Successful", message: "Your account has been logged in successfully")   }       static var errorStatus: StatusViewModel {     return StatusViewModel(title: "Error", message: "Oops! Something went wrong. Please try again.")   } } RegisterViewModel: import Foundation import Combine class RegisterViewModel: ObservableObject {   @Published var email: String = ""   @Published var password: String = ""   @Published var statusViewModel: StatusViewModel?   @Published var state: AppState       private var cancellableBag = Set<AnyCancellable>()   private let authAPI: AuthAPI       init(authAPI: AuthAPI, state: AppState) {     self.authAPI = authAPI     self.state = state   }       func signUp() {     authAPI.signUp(email: email, password: password)       .receive(on: RunLoop.main)       .map(resultMapper)       .replaceError(with: StatusViewModel.errorStatus)       .assign(to: \.statusViewModel, on: self)       .store(in: &cancellableBag)   } } extension RegisterViewModel {   private func resultMapper(with user: User?) -> StatusViewModel {     if user != nil {       state.currentUser = user       return StatusViewModel.signUpSuccessStatus     } else {       return StatusViewModel.errorStatus     }   } } first register screen: struct Register: View {       @ObservedObject private var viewModel: RegisterViewModel   @State var pushActive = false         init(state: AppState) {           self.viewModel = RegisterViewModel(authAPI: AuthService(), state: state)           }   var body: some View {  VStack(){                               TextField("Email Address",text:$viewModel.email)                 .autocapitalization(.none)                 .padding()                  HStack(spacing: 15){                     TextField("Password", text: $viewModel.password)                       .autocapitalization(.none)                                 }   NavigationLink(destination: HomeView(state: viewModel.state),                       isActive: self.$pushActive) {                 Button {                              self.viewModel.signUp()                                     } label: {                   Text("Register")                     .padding()                                     }               } } } second register screen: struct SecondRegister: View {   var body: some View {           GeometryReader { geometry in          ZStack{           VStack(alignment: .center, spacing: 3){                          TextField("First Name",text:self.$first_name)                 .autocapitalization(.none)                 .padding()               TextField("Last Name", text: self.$last_name)                 .autocapitalization(.none)                 .padding()                                 }                 Button {                 } label: {                   Text("Next")                     .padding()                    }             }           }.padding()           }.padding(.top,60)                 }     }
0
0
564
Mar ’22
Why it is throw an error as "Return from initializer without initializing all stored properties" in SwiftUI?
I have simple app in SwiftUI, when I use  @Binding var show : Bool for second register screen, it is throw an error for this line of code   init(state: AppState) {             self.viewModel = RegisterViewModel(authAPI: AuthService(), state: state)           } as a "Return from initializer without initializing all stored properties" any idea? first screen: import SwiftUI struct RegisterFirstScreen: View {   @Binding var show : Bool   init(state: AppState) {             self.viewModel = RegisterViewModel(authAPI: AuthService(), state: state)     }   var body: some View {    NavigationLink(destination: RegisterSecondScreen(state: viewModel.state, show: $show),                            isActive: self.$pushActive) {                 Button {                              viewModel.signUp()                                     } label: {                   Text("Register Now")                     .padding()                    }               } } second screen: struct RegisterSecondScreen: View {   @ObservedObject var state: AppState       @Binding var show : Bool   var body: some View { Text("Next main screen") }}
2
0
2.7k
Mar ’22
Why I am able to register user info to firebase in SwiftUI App?
I have register screen and I am not able to register info to firebase, I put user info on simulator, but it just hold on on screen, and no any change on firebase, any idea? where I missed? import SwiftUI import Firebase struct Register: View {   @State var name = ""   @State var about = ""       @Binding var show : Bool   var body: some View {    VStack(alignment: .center, spacing: 3){                          TextField("Name",text:self.$name)                 .padding()                                       TextField(" about", text: self.$about)                 .padding()                if self.loading{                                          HStack{                                              Spacer()                                              Indicator()                                              Spacer()                     }                   }                                        else{                                 Button {                                       if self.name != "" && self.about != "" {                                                    self.loading.toggle()                     CreateUser(name: self.name, about: self.about) { (status) in                                                          if status{                                                              self.show.toggle()                                                       }                         }                       }                     else{                                                    self.alert.toggle()                                             }                 } label: {                   Text("Next")                     .padding()                    }               } } import Foundation import Firebase func CreateUser(name: String,about : String, completion : @escaping (Bool)-> Void){       let db = Firestore.firestore()       let storage = Storage.storage().reference()       let uid = Auth.auth().currentUser?.uid                   db.collection("users").document(uid!).setData(["name":name,"about":about, "uid":uid!]) { (err) in                   if err != nil{                       print((err?.localizedDescription)!)           return         }                   completion(true)                   UserDefaults.standard.set(true, forKey: "status")                   UserDefaults.standard.set(name, forKey: "UserName")                   NotificationCenter.default.post(name: NSNotification.Name("statusChange"), object: nil)       }     }
0
0
605
Mar ’22
why it say "Extra arguments at positions #3 , #4 in call" in SwiftUI?
I have small problem in my project, it throw an error as a Extra arguments at positions #3, #4 for  Auth.auth().signIn() line, I do not know what I missed? func login(email: String, password: String, name: String, surname: String) -> Future<User?, Never> { return Future<User?, Never> { promise in Auth.auth().signIn(withEmail: email, password: password, name: name, surname: surname) {(authResult, _) in guard let id = authResult?.user.providerID, let email = authResult?.user.email else { promise(.success(nil)) return } let user = User(id: id, email: email, name:name, surname:surname) promise(.success(user)) } } } model: import Foundation struct User { let id: String let email: String let name: String let surname: String }
1
0
769
Mar ’22
Why I am not able to use two screen for registration in SwiftUI?
I have register screen in SwiftUI, and I want to use two screen for register users, one view have mail and password, and other view have name surname and occupation, but I am still do not understand how I will connect both register view, any idea? RegistrationViewModel: enum RegistrationState { case successfullyRegistered case failed(error: Error) case na } protocol RegistrationViewModel { func create() var service: RegistrationService { get } var state: RegistrationState { get } var hasError: Bool { get } var newUser: RegistrationCredentials { get } init(service: RegistrationService) } final class RegistrationViewModelImpl: ObservableObject, RegistrationViewModel { let service: RegistrationService @Published var state: RegistrationState = .na @Published var newUser = RegistrationCredentials(email: "", password: "", firstName: "", lastName: "", occupation: "") @Published var hasError: Bool = false private var subscriptions = Set<AnyCancellable>() init(service: RegistrationService) { self.service = service setupErrorSubscription() } func create() { service .register(with: newUser) .sink { [weak self] res in switch res { case .failure(let error): self?.state = .failed(error: error) default: break } } receiveValue: { [weak self] in self?.state = .successfullyRegistered } .store(in: &subscriptions)}} private extension RegistrationViewModelImpl { func setupErrorSubscription() { $state .map { state -> Bool in switch state { case .successfullyRegistered, .na: return false case .failed: return true}} .assign(to: &$hasError)}} firstscreen: struct RegisterView: View { @StateObject private var viewModel = RegistrationViewModelImpl( service: RegistrationServiceImpl() ) var body: some View { NavigationView { VStack(spacing: 32) { VStack(spacing: 16) { InputTextFieldView(text: $viewModel.newUser.email, placeholder: "Email", keyboardType: .emailAddress, systemImage: "envelope") InputPasswordView(password: $viewModel.newUser.password, placeholder: "Password", systemImage: "lock") } ButtonView(title: "Next") { viewModel.create() } } .padding(.horizontal, 15) .alert(isPresented: $viewModel.hasError, content: { if case .failed(let error) = viewModel.state { return Alert( title: Text("Error"), message: Text(error.localizedDescription)) } else { return Alert( title: Text("Error"), message: Text("Something went wrong")) }})}}} secondscreen: import SwiftUI struct SecondRegisterView: View { @StateObject private var viewModel = RegistrationViewModelImpl( service: RegistrationServiceImpl() ) var body: some View { NavigationView { VStack(spacing: 32) { VStack(spacing: 16) { InputTextFieldView(text: $viewModel.newUser.firstName, placeholder: "First Name", keyboardType: .namePhonePad, systemImage: nil) InputTextFieldView(text: $viewModel.newUser.lastName, placeholder: "Last Name", keyboardType: .namePhonePad, systemImage: nil) InputTextFieldView(text: $viewModel.newUser.occupation, placeholder: "Occupation", keyboardType: .namePhonePad, systemImage: nil) } ButtonView(title: "Sign up") { viewModel.create() } } .padding(.horizontal, 15) .navigationTitle("Register") .applyClose() .alert(isPresented: $viewModel.hasError, content: { if case .failed(let error) = viewModel.state { return Alert( title: Text("Error"), message: Text(error.localizedDescription)) } else { return Alert( title: Text("Error"), message: Text("Something went wrong")) } }) } } }
1
0
783
Mar ’22