从委托方法修改视图控制器属性

Posted

技术标签:

【中文标题】从委托方法修改视图控制器属性【英文标题】:Modify View Controller Property from Delegate Method 【发布时间】:2019-06-10 20:12:05 【问题描述】:

我正在使用 Swift 4.2 和 Xcode 10.2。

我创建了一个自定义警报,它是一个名为 DialAlertUIViewController。它覆盖在当前UIViewController 之上,并有两个按钮,CallCancel

Call 被点击时,我使用名为callTapped. 的委托方法将点击报告给底层视图控制器,该方法使用各种其他方法执行调用设置。在执行呼叫设置时,我想用状态更新DialAlert viewcontroller。但是我无法从委托方法callTapped 访问它的属性,因为它是在 tableView 方法中创建的,如下所示:

let dialAlert = self.storyboard?.instantiateViewController(withIdentifier: Constants.Storyboard.dialAlert) as! DialAlert

我在这个 tableView 方法中设置了它的所有初始属性。

我在课程开始时尝试了这段代码:

var dialAlert = UIViewController() as! DialAlert

然后在整个代码中引用 self.dialAlert(它确实编译了),但在运行时我收到一个错误,我无法将 UIViewController 类型的值转换为 DialAlert

如何在创建实例的方法之外的方法中修改dialAlert 的属性?我在 SO 中找到了一些看起来很有希望的答案,但最近没有,也没有任何意义。

【问题讨论】:

【参考方案1】:

我有你的问题的解决方案,我不知道你如何编写代码来显示你的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

希望对你有帮助。

【讨论】:

这看起来是个好方法。我会尝试并回帖。谢谢!

以上是关于从委托方法修改视图控制器属性的主要内容,如果未能解决你的问题,请参考以下文章

从应用程序委托获取当前视图控制器(模式是可能的)

从委托类调用视图控制器方法,有问题

从应用委托类调用视图控制器的方法

从多个视图控制器接收委托方法调用

如何从人员选择器委托方法返回两个视图控制器

Objective-C – 从应用程序委托向视图控制器发送消息