我正在使用Swift 4.2和Xcode 10.2。
我创建了一个自定义警报,该警报是名为UIViewController
的{{1}}。它覆盖在当前DialAlert
的顶部,并具有两个按钮UIViewController
和Call
。
当点击Cancel
时,我使用名为Call
的委托方法将拍子报告给基础视图控制器,该方法使用其他各种方法执行呼叫建立。在执行呼叫设置时,我想用状态更新callTapped.
视图控制器。但是我无法从委托方法DialAlert
访问其属性,因为它是在tableView方法中创建的,如下所示:
callTapped
正是在这个tableView方法中,我设置了它的所有初始属性。
我在课堂开始时尝试了以下代码:
let dialAlert = self.storyboard?.instantiateViewController(withIdentifier: Constants.Storyboard.dialAlert) as! DialAlert
,然后在整个代码中引用了self.dialAlert(确实进行了编译),但是在运行时出现错误,无法将类型var dialAlert = UIViewController() as! DialAlert
的值强制转换为UIViewController
。
如何在创建实例的方法之外的方法中修改DialAlert
的属性?我在SO中找到了一些看起来很有希望的答案,但没有什么新意,也没有重点。
答案 0 :(得分:0)
对于您的问题,我有解决方案,我不知道您如何编码来显示DialAlert
,但根据我的经验,您可以理解如何实现它。
因此,首先在 AppDelegate.swift 方法中添加以下代码。
class AppDelegate: UIResponder, UIApplicationDelegate {
static var shared = UIApplication.shared.delegate as! AppDelegate
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
return true
}
.....
.....
}
此后,在对话框警报中声明协议并创建委托,除了该检查委托并在单击按钮时调用委托方法。
DialAlertVC.swift
protocol DialAlertVCDelegate: class {
func callButtonTapped(_ sender: UIButton)
func cancelButtonTapped(_ sender: UIButton)
}
class DialAlertVC: UIViewController {
@IBOutlet weak var dialAlertView: UIView!
weak var delegate : DialAlertVCDelegate?
class func viewController() -> DialAlertVC {
return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "DialAlertVC") as! DialAlertVC
}
@IBAction func btnCallTapped(_ sender: UIButton) {
if let selfDelegate = self.delegate {
selfDelegate.callButtonTapped(sender)
}
}
@IBAction func btnCancelTapped(_ sender: UIButton) {
if let selfDelegate = self.delegate {
selfDelegate.cancelButtonTapped(sender)
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
现在是时候显示/隐藏DialoAlertVC
,因此在ViewController
内添加以下代码。
ViewController.swift
class ViewController: UIViewController {
@IBOutlet weak var lblButtonTapped: UILabel!
var dialAlertVC : DialAlertVC?
@IBAction func btnShowDialAlert(_ sender: UIButton) {
self.showDialAlert(true)
}
func showDialAlert(_ show: Bool) {
if show {
if self.dialAlertVC != nil {
self.dialAlertVC?.view.removeFromSuperview()
self.dialAlertVC = nil
}
dialAlertVC = DialAlertVC.viewController()
dialAlertVC?.delegate = self
AppDelegate.shared.window?.addSubview(dialAlertVC!.view)
} else {
if self.dialAlertVC != nil {
self.dialAlertVC?.view.removeFromSuperview()
self.dialAlertVC = nil
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
extension ViewController: DialAlertVCDelegate {
func callButtonTapped(_ sender: UIButton) {
self.showDialAlert(false)
self.lblButtonTapped.text = "Call Button Tapped"
}
//------------------------------------------------------------------------------
func cancelButtonTapped(_ sender: UIButton) {
self.showDialAlert(false)
self.lblButtonTapped.text = "Cancel Button Tapped"
}
}
在此处查看演示项目:https://gofile.io/?c=P2VKCl
我希望这会对您有所帮助。