簡體   English   中英

取消模態視圖時VC中的觸發功能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM