【发布时间】:2018-09-04 22:02:01
【问题描述】:
我有一个协议
protocol HandleEmbedController: class {
func printMsg()
}
还有 2 个容器视图和 2 个对应的 ViewControllers
class EnemyBaseVC: UIViewController, HandleEmbedController {
override func viewDidLoad() {
super.viewDidLoad()
}
var value1 = ""
func printMsg(){
print("printing some embedded message")
}
}
和
class EnemyBase2VC: UIViewController, HandleEmbedController {
func printMsg() {
print("enemy base 2 message")
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
并且都使用协议HandleEmbedController并实现printMsg功能。
在主 ViewController 我有
class HomeBaseVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
var handleEmbedController:HandleEmbedController?
@IBAction func onclick(_ sender: UIButton) {
handleEmbedController?.printMsg()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "embedseg"){
if let embed = segue.destination as? EnemyBaseVC {
self.handleEmbedController = embed
}
}
if (segue.identifier == "embedseg2"){
if let embed = segue.destination as? EnemyBase2VC {
self.handleEmbedController = embed
}
}
}
}
当按钮被点击时,总是EnemyBaseVC方法被调用并打印
printing some embedded message
有没有办法决定调用哪个方法?
【问题讨论】:
-
问题不在于决定调用哪个方法。调用的方法将是在
handleEmbedController指向的任何类中实现的printMsg。错误不在onclickfunc 我相信它在if let embed = segue.destination as? EnemyBase2VC或if (segue.identifier == "embedseg2") -
我的意思是,这两个条件下的代码似乎是正确的。我的意思是,那些
ifs 是您的逻辑可能中断的地方。但是错误可能来自故事板中的segue。可以是标识符或目的地类别中的拼写错误。 -
@Gonzo 不错!
-
@Gonzo 我检查了标识符。他们是正确的。当应用程序启动时仅调用 EnemyBaseVC 中的 viewDidLoad()。未调用 EnemyBaseVC2。有没有一种方法可以通过单击按钮以编程方式调用它们
-
@IsankaLakshan 基于我所看到的,当你的主视图控制器被加载时,两者都应该被触发。我会在 EnemyBaseVC viewDidLoad 中放置一个断点,并确保它不会被实例化两次。否则,如果您想借此聊天和分享您的代码,我很乐意看一看,看看发生了什么。
标签: ios swift uiviewcontroller delegates