[英]Trigger function in VC when modal view is dismissed
我試圖在將模態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
}
}
斯威夫特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
}
在您的代碼中,您有:
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
或類似的東西。)
如果您需要內執行代碼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?
你的代碼仍然會運行相同,我只是建議這樣做,因為它幫助我在許多實例中避免了內存問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.