重新呈现ViewController不会重新初始化它

时间:2015-10-28 19:02:09

标签: ios swift opentok tokbox

我有一个viewController(videocallVC),我想在每次进入视图/加载时进行初始化。 目前,videocallVC仅在第一次初始化。如果我离开videocallVC,转到另一个viewController并返回到videocallVC,它将最后一个会话保存在内存中,并且不会“刷新”。

如何确保每次呈现videocallVC时都会重新初始化?

import OpenTok

class videocallVC: UIViewController, OTSessionDelegate, OTSubscriberKitDelegate, OTPublisherDelegate {

    @IBOutlet var subscribeView: UIView!
    @IBOutlet var publishView: UIView!

    let apiKey = "xxxxxxx"

    var session : OTSession?
    var publisher : OTPublisher?
    var subscriber : OTSubscriber?
    var connection : OTConnection?


    override func viewDidLoad() {
        super.viewDidLoad()

        session = OTSession(
            apiKey: apiKey,
            sessionId: variableInstance.sessionID,
            delegate: self)
    }

    override func viewWillAppear(animated: Bool) {
        doConnect()
    }

    // MARK: - OpenTok Methods

    /**
    * Asynchronously begins the session connect process. Some time later, we will
    * expect a delegate method to call us back with the results of this action.
    */
    func doConnect() {
        if let session = self.session {
            var maybeError : OTError?
            session.connectWithToken(variableInstance.tokboxToken, error: &maybeError)
            if let error = maybeError {
                showAlert(error.localizedDescription)
            }
        }
    }

    /**
    * Sets up an instance of OTPublisher to use with this session. OTPubilsher
    * binds to the device camera and microphone, and will provide A/V streams
    * to the OpenTok session.
    */
    func doPublish() {
        publisher = OTPublisher(delegate: self)

        var maybeError : OTError?
        session?.publish(publisher, error: &maybeError)

        if let error = maybeError {
            showAlert(error.localizedDescription)
        }

        view.addSubview(publisher!.view)
        publisher!.view.frame = publishView.frame

    }

videocallVC还有更多代码,但我猜这足以理解这个问题。

非常感谢任何帮助!谢谢。

2 个答案:

答案 0 :(得分:1)

方法viewDidLoad仅被调用一次。每次出现视图时都会调用方法viewWillAppear。因此,如果您每次出现视图时都需要执行操作,请将其移至该方法(如果UI行为有意义,您也可以使用viewDidAppear)。这可能适用于session = OTSession( ... )代码段。

也许有可能,在你的代码中,事物被初始化,然后存储在变量中,如果变量不是nil,则不会进行新的初始化。您可以通过在nil中将这些变量设置为viewWillAppear来解决此问题。

但是,如果不知道所有细节,这可能是一个可能的解决方案,但仍然是在黑暗中拍摄: - )

答案 1 :(得分:0)

您的代表如何在OTSession和OTPublisher中存储?

他们弱吗?

如果它们不弱,则无法取消初始化View Controller,因为仍然有对它的引用。也许这会导致你的问题。