Reputation: 117
how can I navigate from UIAlertController(UIKit) to a new view(SwiftUi) due the the reason the swiftui alert can't use a textfield I used UIKit(UIalertcontroller) and I want to open a new screen after I click the submit button
I have tried:
var passwordField: UITextField? = nil
let alert = UIAlertController(title: "Admin Passcode", message: "Please enter an administrator password", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Submit", style: .default, handler: { Action in
if let passwordField = passwordField {
if passwordField.text == Constants.AdminPwd {
print("Wow😁")
DeviceConfigurationView(activeView: true)
} else {
let alert2 = UIAlertController(title: "Bad Password", message: "Incorrect password", preferredStyle: .alert)
alert2.addAction(UIAlertAction(title: "Dismiss", style: .default, handler: nil))
rootContoller().present(alert2, animated: true, completion: nil)
}
}
}))
alert.addAction(UIAlertAction(title: "Cancel", style: .default) {
action in
alert.dismiss(animated: true)
})
alert.addTextField {
(textField) in
textField.placeholder = "Password"
textField.isSecureTextEntry = true
textField.becomeFirstResponder()
passwordField = textField
}
rootContoller().present(alert, animated: true, completion: nil)
func rootContoller()->UIViewController{
guard let screen = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
return .init()
}
guard let root = screen.windows.first?.rootViewController else {
return .init()
}
return root
}
}
this is the view I want to navigate to:
import UIKit
struct DeviceConfigurationView: View {
@State var activeView: Bool
var body: some View {
NavigationView {
DeviceView()
}
.navigationViewStyle(.stack)
}
}
struct DeviceView: View {
@Environment(\.presentationMode) var presentationMode
@State var ToggleIsOn: Bool = false
@State var isExpandAudioSampleRate: Bool = false
@State var isExpandVideoResolution: Bool = false
@State var isExpandVideoResolutionForLocalVideoFile: Bool = false
@State private var textField: String = ""
var body: some View {
List {
// Device
Section(header:Text("Device"),
footer:
HStack {
Text("Device ID")
TextField("Device id", text: $textField)
}) {
}
// offline
Section {
Toggle(isOn: $ToggleIsOn) {
Text("Offline Mode")
.opacity(5)
}
} header: {
Text("Offline")
}
// manage Recordings
Section {
Button {
// action
} label: {
Text("Delete All Recordings")
.foregroundColor(Color.Theme.redcoolor)
}
} header: {
Text("Manage Recordings")
}
// Firebase
Section {
HStack {
Text("Crash testing")
Spacer()
Button {
// action
} label: {
Text("Crash")
.foregroundColor(Color.blue)
}
}
} header: {
Text("Firebase")
}
Section {
HStack{
Text("Audio SampleRate")
.bold()
Spacer()
Button {
isExpandAudioSampleRate.toggle()
} label: {
Image(systemName: isExpandAudioSampleRate ? "chevron.up" : "chevron.down")
.foregroundColor(Color.blue)
.font(.system(size: 30))
}
}
}
Section {
HStack{
Text("Video Resolution")
.bold()
Spacer()
Button {
isExpandVideoResolution.toggle()
} label: {
Image(systemName: isExpandVideoResolution ? "chevron.up" : "chevron.down")
.foregroundColor(Color.blue)
.font(.system(size: 30))
}
}
}
Section {
HStack{
Text("Video Resolution For Local Video File")
.bold()
Spacer()
Button {
isExpandVideoResolutionForLocalVideoFile.toggle()
} label: {
Image(systemName: isExpandVideoResolutionForLocalVideoFile ? "chevron.up" : "chevron.down")
.foregroundColor(Color.blue)
.font(.system(size: 30))
}
}
}
}
.listStyle(PlainListStyle())
.navigationTitle("Device Configuration")
.navigationBarItems(
leading: Button(action: {
presentationMode.wrappedValue.dismiss()
print("Cancelled")
}, label: {
Text("Cancel")
}),
trailing: Button(action: {
// MainView()
print("Saved")
}, label: {
Text("Save")
}))
}
}
and I am getting this error my error
Upvotes: 2
Views: 181
Reputation: 258413
From your code logic, it seems to be like
if passwordField.text == Constants.AdminPwd {
print("Wow😁")
let controller = UIHostingController(rootView: DeviceConfigurationView(activeView: true))
rootContoller().present(controller, animated: true, completion: nil)
} else {
...
}
Upvotes: 1