【问题标题】:How can I pass dictionary from one view controller class to another?SWIFT如何将字典从一个视图控制器类传递到另一个?SWIFT
【发布时间】:2020-07-29 17:35:02
【问题描述】:

我正在尝试在一个视图控制器中列出用户及其密码,将该信息保存在字典中,然后将该字典发送到另一个视图控制器,要求用户输入他们的用户名/密码组合以授权日志in.(键是用户名,值是密码)。有没有办法可以将字典从 SecondVC 发送到 FirstVC?

First View Controller

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var Username: UITextField!
    
    @IBOutlet weak var Verification: UILabel!
    @IBOutlet weak var Password: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        Username.delegate = self
        Password.delegate = self

    }
    
    var usersDict = [String : String]()
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let des = segue.destination as? AccountViewController {
            des.usersDict = usersDict
        }
    }
    


    @IBAction func Authorization(_ sender: Any) { 
        for ( key , value ) in usersDict{
            let v = key.count
            var start = 0
            if start <= v{
                if Username.text == key{
                    if Password.text == value{
                        Verification.text = "Looks Good"
                    }
                }
                else{
                    start += 1
                }
            }
            else{
                Verification.text = "Yikes"
            }
            
            
        }
        


    }
    
}

Second View Controller
class AccountViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var CreateUsername: UITextField!
    @IBOutlet weak var CreatePassword: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        CreateUsername.delegate = self
        CreatePassword.delegate = self

        // Do any additional setup after loading the view.
    }
    
    var usersDict = [ String : String ]()

    @IBAction func MakeANewAccount(_ sender: Any) {
        usersDict[CreateUsername.text!] = CreatePassword.text!
    }
    

}

我已经制作了字典,但它只会在开始时发送,并且在创建原始帐户后不会更新。 (它发送的字典是空的)

【问题讨论】:

  • 分享您的代码并尝试这样做
  • 有很多不同的方法可以做到这一点。使用哪个取决于您如何从 SecondVC 链接到 FirstVC。
  • 发布将用户从第一个视图控制器链接到第二个视图控制器的代码。
  • 你有转场吗?
  • 我没有使用任何代码,我使用按钮和拖动从一个到下一个和返回。

标签: ios swift xcode dictionary


【解决方案1】:

ViewController 中添加这个方法

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let des = segue.destination as? AccountViewController {
        des.usersDict = yourDicHere
    }
}

【讨论】:

  • 非常感谢您提供此代码。为了澄清,当你写 yourDicHere 我必须在 ViewController 中创建一个新字典对吗?
  • 也许我误解了这个问题,但字典不应该朝另一个方向发展吗?
  • @PhillipMills op 在每个 vc 上面写了第一个和第二个 usersDict 是第二个 vc 中的占位符
  • 由于他在第二个创建了字典,我认为他想将它发送回第一个进行授权。也许不吧。 :)
  • @PhillipMills 是的,我误解了 Sh_Khan 建议使用的代码。现在我回到了我的代码,它没有发回它(这是我认为代码所做的)。使用 Khan 的代码,我可以发送它,但是添加另一个帐户后更新的字典没有。有没有一种方法可以让我发送更新的字典而不仅仅是在开始时发送,因为如果我在开始时发送它是空的。
【解决方案2】:

这是使控制器处理来自它创建的某个对象的数据的一般模式,在本例中是第二个控制器。

尝试将其应用于您的情况,如果遇到问题,请告诉我。

protocol Processor {
    func process(_ dict: [String : String])
}

class FirstController: UIViewController, Processor {
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let controller = segue.destination as? SecondController {
            controller.delegate = self
        } else {
            print("Unexpected view controller \(segue.destination)")
        }
    }
    
    func process(_ dict: [String : String]) {
    }
}

class SecondController: UIViewController {
    var delegate: Processor?
    
    func someWork() {
        if let processor = delegate {
            processor.process(["Name" : "Pwd"])
        } else {
            print("Delegate not assigned")
        }
    }
}

【讨论】:

  • 很抱歉问了一些简单的问题,但是我应该在哪里添加此代码(视图控制器、应用程序委托等)?另外,我是只用 usersDict 替换 (_dict : [String : String]) 还是有更多的地方我必须使用不同的变量。
  • 这不是复制/粘贴,而是您的类如何相互交互的一种模式。如果您尝试了解它在做什么并将逻辑应用于您所拥有的东西,这可能是最好的。
  • 据我了解,处理器协议定义了字典,在第二个控制器的代码中,我看到 func someWork 正在访问协议处理器中的 func 进程。在处理器中调用协议中的字典后,我如何再次引用它(添加新的用户名和密码)?在 IBAction 中引用字典我试过 Processor.process[CreateUsername.text!] = CreatePassword.text!添加新条目,但是它发送错误消息“类型'(处理器)->(字符串:字符串])->()”的值没有下标。非常感谢您的帮助。
  • 我将代码更改为 processor.process([CreateUsername.text! : CreatePassword.text!]) 并且它不会抛出任何错误消息。我仍然需要有关如何在 For-in 循环中引用 FirstViewController 中的字典的帮助(for-in 循环是为了授权用户并允许他们使用该应用程序)。我理解您给我的模板的方式是使用协议将字典从第二个视图控制器发送到第一个?我的理解正确吗?
猜你喜欢
  • 2014-05-07
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多