gpt4 book ai didi

swift - 带有选项卡 View Controller 的 Segue 保持传递值

转载 作者:行者123 更新时间:2023-11-28 16:04:11 25 4
gpt4 key购买 nike

我正在开发一个围绕选项卡 View Controller 构建的 iOS 应用程序。我创建了一个“联系人”选项卡,用户可以在其中找到并从列表中选择联系人。当用户选择联系人时,它会获取联系人的姓名并将其传递到不同的选项卡。该功能是这样完成的:

 func passName(name: String) {

let navTab = self.tabBarController!.viewControllers![2] as! UINavigationController

let homeTab = navTab.viewControllers[0] as! MainController
homeTab.passedName = name
tabBarController?.selectedIndex = 2

}

到目前为止一切正常(名称已加载到文本字段中)。我的问题是,每次我更改选项卡然后返回到我的“主页”选项卡时,该值似乎都在不断返回。例如,如果我从我的联系人中选择“John”,它会带我到“主页”选项卡并将 John 的名字放在文本字段中。假设我删除了名字的最后两个字母,所以现在是“Jo”。如果我加载不同的选项卡并返回,名称字段已重置为“John”。就好像每次我打开“主页”选项卡时都会重新传递该值。此外,每次我在传递名称后加载主页选项卡时,我的控制台都会打印:“传递的名称:John”,因此它表明每次出现该选项卡时都在处理它。这是我处理名称的代码:

 var passedName: String!

override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)

//Checks if name was passed to controller
if let validName = passedName {
print("Name passed: \(validName)")
nameTextField.text = validName
}

}

我是否错误地传递了数据?我想这可能是因为我在 viewWillAppear 方法中调用了上面的代码,但这没有意义,因为基本上数据只从联系人选项卡传递一次。谢谢!

最佳答案

问题是您实际上并没有将值传递回原始 View 。 Apple 建议在类之间传递信息是使用委托(delegate)模式。这允许模态视图调用委托(delegate)类的函数,该函数将本地名称更改为原始 View ,因为该函数是在原始 View 的 viewController 中声明的。您可以阅读有关模式的更多信息 in this tutorial ,但我还在下面提供了一个与您的用例相关的简短示例。

主视图 Controller :

class namesTableViewController: UITableViewController, editNameDetailsViewControllerDelegate {
var name : String
@IBAction func editButtonPressed(_ sender: UIBarButtonItem) {
performSegue(withIdentifier: "editPerson", sender: self)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "editPerson" { //Modal segue
let navController = segue.destination as! UINavigationController
let controller = navController.topViewController as! editNameViewController
controller.delegate = self
if let person = sender as? Person {
print("Sending person to edit")
controller.personToEdit = person
}
} else {
super.prepare(for: segue, sender: sender)
}
}

//Protocol function
func changeName(n: String, controller: UIViewController) {
name = n
dismiss(animated: true, completion: nil)
}
}

编辑名称 View Controller :

class editNameViewController: UIViewController {

@IBOutlet weak var personNameTextField: UITextField!

var personToEdit : Person?
weak var delegate : PersonTableViewController?

override func viewDidLoad() {
super.viewDidLoad()

if personToEdit != nil {
personNameTextField.text = personToEdit?.name
}
}

// Button Actions
@IBAction func saveButtonPressed(_ sender: UIBarButtonItem) {
delegate?.personDetailsView(n: personNameTextField.text, controller: self)
}
}

最后,协议(protocol)类:

protocol editNameDetailsViewControllerDelegate : class {
func personDetailsView(n: String, controller: UIViewController)
}

希望这对您有所帮助。

关于swift - 带有选项卡 View Controller 的 Segue 保持传递值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40539539/

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