SwiftUI中的Alert还不完善不能添加文本框,于是要用到UIKIt
- 新建一个Swift文件
//
// AlertWithTextField.swift
// Potatoes
//
// Created by Diego on 2021/2/25.
//
import Foundation
import UIKit
import SwiftUI
public func alertWithTextField(title: String, message: String) -> String {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
var textFieldText: String = ""
alert.addTextField() { textField in
textField.placeholder = "在此输入内容"
}
alert.addAction(UIAlertAction(title: "取消", style: .cancel) { _ in })
alert.addAction(UIAlertAction(title: "确认", style: .default) {_ in
let textField = alert.textFields![0]
textFieldText = textField.text ?? ""
print( textField.text ?? "" )
})
showAlert(alert: alert)
return textFieldText
}
func showAlert(alert: UIAlertController) {
if let controller = topMostViewController() {
controller.present(alert, animated: true)
}
}
private func keyWindow() -> UIWindow? {
return UIApplication.shared.connectedScenes
.filter {$0.activationState == .foregroundActive}
.compactMap {$0 as? UIWindowScene}
.first?.windows.filter {$0.isKeyWindow}.first
}
private func topMostViewController() -> UIViewController? {
guard let rootController = keyWindow()?.rootViewController else {
return nil
}
return topMostViewController(for: rootController)
}
private func topMostViewController(for controller: UIViewController) -> UIViewController {
if let presentedController = controller.presentedViewController {
return topMostViewController(for: presentedController)
} else if let navigationController = controller as? UINavigationController {
guard let topController = navigationController.topViewController else {
return navigationController
}
return topMostViewController(for: topController)
} else if let tabController = controller as? UITabBarController {
guard let topController = tabController.selectedViewController else {
return tabController
}
return topMostViewController(for: topController)
}
return controller
}
- 返回值为文本框内容:String
public func alertWithTextField(title: String, message: String) -> String
- 在SwiftUI中直接调用
Button("重命名"){
let newFolderName = alertWithTextField(title: "重命名", message: "输入要新的文件夹名称")
print("新文件夹名称:\(newFolderName)")
}
//最后在这里写上你需要的代码 newFolderName是返回来的String