我试图在将模态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
}
}
答案 0 :(得分:13)
Swift 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
}
答案 1 :(得分:2)
在您的代码中,您有:
func saveNewUser(){
self.delegation?.newUserAction()
self.dismiss(animated: true, completion: nil)
}
}
在completion:
func saveNewUser() {
self.delegation?.newUserAction()
self.dismiss(animated: true, completion: { finished in
// on completion
})
}
}
(你可能甚至不需要说finished in
或类似的东西。)
答案 2 :(得分:0)
如果您需要在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?
您的代码仍将运行相同,我建议这样做,因为它帮助我避免了许多情况下的内存问题。