【问题标题】:Trigger function in VC when modal view is dismissed当模态视图被解除时,VC中的触发函数
【发布时间】:2017-01-12 16:23:09
【问题描述】:

我试图在将模态 VC (FirstStartVC) 解散回主 VC 后触发一个函数。我知道我必须使用委托,但它不起作用并且我的调试区域保持空白。

在其他问题主题中,有些人的工作方式与下面的完全相同。所以我不知道我做错了什么。有谁知道我需要更改代码吗?

//  FirstStartVC.swift
//

import UIKit
import CoreData
import JSSAlertView

protocol NewUser: class {
    func newUserAction()
}

class FirstStartVC: UITableViewController, UITextFieldDelegate {

    var delegation : NewUser?

    func saveNewUser(){
            self.delegation?.newUserAction()
            self.dismiss(animated: true, completion: nil)
        }
    }

    @IBAction func saveSettings(_ sender: Any) {
        self.saveNewUser()
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        print (delegation)

    }
}





//
//  ViewController.swift
//

import UIKit
import UserNotifications
import GoogleMobileAds
import CoreData
import JSSAlertView

class ViewController: UIViewController, UNUserNotificationCenterDelegate, NewUser {
    func newUserAction() {
        print("Reload some labels")
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        var firstStart = FirstStartVC()
        firstStart.delegation = self

    }
}

【问题讨论】:

  • 看起来你想在这个视图控制器完成它的事情时通知'主 VC'。你能分享你在'main VC'中的代码吗?

标签: ios swift delegates modal-dialog protocols


【解决方案1】:

斯威夫特 3

在你的主 VC viewDidLoad 添加:

NotificationCenter.default.addObserver(self, selector: #selector(mainVc.functionName), name:"NotificationID", object: nil)

并在主 VC 中添加一个函数

func functionName() {

    // Do stuff

}

在 FirstStartVC 中调用方法

NotificationCenter.default.postNotificationName("NotificationID", object: nil)

希望这会有所帮助!


在 Swift 4 上的简单编辑

NotificationCenter.default.addObserver(self, selector: #selector(self.funcName), name: NSNotification.Name(rawValue: "NotificationID"), object: nil)

@objc放在函数定义之前。

@objc func functionName() {

    // Do stuff

}

【讨论】:

  • 完美答案!
  • 非常感谢! Bc 代表在我的情况下不会!
  • Xcode 现在提示这些略有不同 - NotificationCenter.default.addObserver(self, selector: #selector(mainVc.functionName), name:NSNotification.Name(rawValue: "NotificationID"), object: nil) NotificationCenter.default.post(name: NSNotification.Name(rawValue: "NotificationID"), object: nil)
【解决方案2】:

在您的代码中,您有:

func saveNewUser(){
        self.delegation?.newUserAction()
        self.dismiss(animated: true, completion: nil)
    }
}

只需在completion:中写下你想在dismiss后运行的代码:

func saveNewUser() {
        self.delegation?.newUserAction()
        self.dismiss(animated: true, completion: { finished in
            // on completion
        })
    }
}

(你甚至可能不需要说finished in 或类似的话。)

【讨论】:

    【解决方案3】:

    如果您需要在newUserAction() 中执行的代码是FirstStartVC 的一部分,您应该在dismiss(_:animated:) 方法的完成处理程序中调用它。但是,如果您需要在提供FirstStartVC 的VC 上执行代码,请确保它符合NewUser 协议。你可以做这样的事情(假设展示的 VC 被命名为 PresentingViewController - 将它更改为你的项目的任何情况):

    class PresentingViewController: UIViewController {
    
        // However you instantiate the FirstStartVC
        let firstStart = FirstStartVC()
    
        // set the delegation property to self
        firstStart.delegation = self
    
    }
    

    然后在屏幕底部创建一个extension,使其符合protocol

    extension PresentingViewController: NewUser {
    
        func newUserAction() {
    
            // Here you can do whatever you want when the delegation calls this method
    
        }
    
    }
    

    编辑:- 进一步推荐...

    我总是发现委托的最佳实践是使用weak 引用来防止内存问题。为此,您必须确保将protocol 设置为:class,您已经完成了:protocol NewUser: class。因此,当您在 FirstStartVC 顶部创建属性时,您只需说

    weak var delegation: NewUser?
    

    您的代码仍然可以运行,我只是建议这样做,因为它可以帮助我避免在许多情况下出现内存问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多