gpt4 book ai didi

swift - 基本 : Connecting multiple (View-)Controllers the right way

转载 作者:搜寻专家 更新时间:2023-10-31 19:40:01 26 4
gpt4 key购买 nike

我正在尝试设置一个登录屏幕 (ViewController),它会在成功登录后引导至一个用户列表 (UserTableViewController),它本身就是导航 Controller 。在 UserTableViewController 等后续屏幕上,应该可以注销。这会将用户带回到初始登录屏幕 ViewController。我真的很难以正确的方式连接这些屏幕。必须要说的是,我对不同类型的转场和/或委托(delegate)没有太多经验,所以在完成一些研究后,我进行了一些试验:

  1. ViewController 上成功登录会触发导航 Controller 的模式转接(它本身会导致 UserTableViewController)
  2. UserTableViewController 有一个注销按钮,可触发另一个返回 ViewController 的模式转场。我采用这些模式转场是因为首先,我不想有一个导致自动创建后退按钮或类似按钮的层次结构,其次,我不想在这两个屏幕之间有任何“麻烦”,一个有导航 Controller ,而另一个没有。

……看来这不是个好办法。一些事情在一个循环之后变得困惑,并且屏幕以错误的方式改变。我想模态转场循环是不可能的,因为至少必须有 parent 和 child 。下次试用:

  1. ViewController 上成功登录会触发导航 Controller 的模式转场/推送转场(它本身会导向 UserTableViewController)
  2. 为了返回登录屏幕,我实现了一个代理而不是另一个 segue,在点击“注销”时触发 - 这里我遇到了无法设置 UserTableViewController 的问题在 ViewController 上正确委托(delegate) preparingForSegue。此时 segue.destinationViewController 不能向下转换为 UserTableViewController 而只能向下转换为 NavigationController 什么不允许我在目的地设置委托(delegate)(UserTableViewController)。

第三个尝试是像第二种方法一样做同样的事情,但是从 ViewController 实现一个 segue直接到 UserTableViewController。这可能行得通,但现在我的 UserTableViewController 中没有任何导航栏了......!

当然,我可以在第三种解决方案中进行手动修复,例如插入独立的导航栏,但这两种方法似乎都没有效率。因此,我非常感谢一些提示,一方面强调了我(完全)误解的内容,另一方面展示了一种很好的方法。非常感谢您的帮助!

编辑:我可以尝试将导航 Controller 设置为初始 View Controller ,然后让登录屏幕 ViewControllerUserTableViewController 呈现/关闭 - 这是一种实用的方法还是存在那些登录 View 场景的广为人知的最佳实践?

只是视觉帮助: enter image description here

最佳答案

请考虑使用“unwind”转场。在 ViewController 中创建如下函数:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
yourLogoutCode()
}

UserTableViewController 中,按住 control 从 Logout 按钮拖动到 UserTableViewController 的退出符号,这是顶部的第三个按钮,然后选择 unwindToThisViewController(或您在 ViewController 中选择的任何名称)。

现在,当您单击注销按钮时,您将返回到 ViewController 并执行 unwindToThisViewController,您可以在其中放置注销代码。

这是一个例子:

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

func yourLogoutCode() {
println("Logging Out ...")
}

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
self.yourLogoutCode()
}


}

和 UserTableViewController:

import UIKit
var selectedRow = -1
class UserTableViewController: UITableViewController {
var firstArray = ["Item1","Item2","Item3","Item4"]
override func viewDidLoad() {
super.viewDidLoad()

}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()

}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return firstArray.count
}


let nameOfCell = "Cell"
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(nameOfCell, forIndexPath: indexPath) as UITableViewCell
cell.textLabel!.text = firstArray[indexPath.row]
return cell
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
selectedRow = indexPath.row

}


}

请注意,从注销按钮到展开的整个连接都隐藏在 Storyboard 中。您可以通过查看连接检查器来确认所有这一切都在发生。

关于swift - 基本 : Connecting multiple (View-)Controllers the right way,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25813893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com