取消模态视图时VC中的触发功能

时间:2017-01-12 16:23:09

标签: ios swift delegates modal-dialog protocols

我试图在将模态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 个答案:

答案 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设置为您已完成的:classprotocol NewUser: class。那么当您在FirstStartVC顶部创建属性时,您只需说出

weak var delegation: NewUser?

您的代码仍将运行相同,我建议这样做,因为它帮助我避免了许多情况下的内存问题。