以编程方式转换到同一视图控制器?

5

有没有一种方法可以在Swift中转到同一个视图控制器?关于这个问题,Objective-C中有一个答案,但是我无法将它转换为Swift。

更新:我已经成功推送到了同一个视图控制器,但是它立即出现错误,因为它无法识别在故事板上创建的对象。

let aViewController:myVC = myVC()
self.navigationController!.pushViewController(aViewController, animated:false)

在加载新(相同)视图控制器时,它会在第一行出现错误:
myText.editable = false;

尝试使用self.viewDidLoad(),它会自动重新加载相同的视图控制器。 - Anbu.Karthik
@Anbu.Karthik 有没有办法在再次调用load时传递参数?我最初使用prepareforsegue加载这个视图,并传递了参数。 - user5130344
如果您使用此概念,总视图控制器将分配内存,在这里使用NSUserDefault,否则使用本地DB值。 - Anbu.Karthik
@Anbu.Karthik 我注意到如果我使用这种方法,每次调用viewdidload后我的内存使用量会继续翻倍。然后在打开不同的视图控制器后,内存会恢复到正常使用水平。 - user5130344
@DevTonio,你能否取消对我的回答的点赞? - Anbu.Karthik
3个回答

8

在故事板中为您的UIViewController设置一个标识符。然后使用该标识符实例化它:

let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "someViewController")

如果您想设置变量,请确保进行vc转换。下面的示例将帮助您了解您在相同控制器上有多少级别:

let vc = storyboard.instantiateViewController(withIdentifier: "rootViewController") as! MyRootViewController
vc.level = self.level + 1

@Anbu.Karthik 在 OP 进行以下操作的地方:let aViewController:myVC = myVC() - Ishan Handa
@Rage 谢谢!这正是我在寻找的。 - user5130344

6

我在 Swift 方面做得不多,但是看起来那个答案使用 self.navigationController?.pushViewController(viewController, animated:true) 应该可以行得通。


无法运行,出现以下错误:***终止应用程序,原因是未捕获的异常'NSInvalidArgumentException',原因是不支持多次推送相同的视图控制器实例。 - user5130344
你不能推送相同的实例(即 self)- 你需要从你的故事板中实例化一个新的实例。 - Paulw11
@Paulw11 谢谢,我已经成功将它推到同一个视图控制器,但它立即出现错误,因为它无法识别最初在故事板上创建的对象。例如,我将textview.editable设置为false,但由于可选的nil而出现错误。 - user5130344
你是如何创建新实例的? - Paulw11
谢谢,self.navigationController.pushViewController(vc, animated: true) 在实例化视图控制器后正是我需要的。 - Andy Rice

0

首先,您需要将重新加载按钮与ViewController连接,并为segue标识符命名(例如“yourIdentifier”)

然后,您需要使用:

override func prepare(for segue: UIStoryboardSegue, sender: Any?){
if segue.identifier == "yourIdentifier"{
self.viewDidLoad()
}

这应该会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接