我有一个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还有更多代码,但我猜这足以理解这个问题。
非常感谢任何帮助!谢谢。
答案 0 :(得分:1)
方法viewDidLoad
仅被调用一次。每次出现视图时都会调用方法viewWillAppear
。因此,如果您每次出现视图时都需要执行操作,请将其移至该方法(如果UI行为有意义,您也可以使用viewDidAppear
)。这可能适用于session = OTSession( ... )
代码段。
也许有可能,在你的代码中,事物被初始化,然后存储在变量中,如果变量不是nil
,则不会进行新的初始化。您可以通过在nil
中将这些变量设置为viewWillAppear
来解决此问题。
但是,如果不知道所有细节,这可能是一个可能的解决方案,但仍然是在黑暗中拍摄: - )
答案 1 :(得分:0)
您的代表如何在OTSession和OTPublisher中存储?
他们弱吗?
如果它们不弱,则无法取消初始化View Controller,因为仍然有对它的引用。也许这会导致你的问题。