英文:
I can't realise delegate pattern
问题
I can provide a translation of the provided code without the code parts:
在SWIFT中的初学者
我有2个视图控制器(ViewController),并希望在第二个视图控制器(secondVC)中显示我在第一个视图控制器(firstVC)中输入的内容。我查看了一些类似的主题,但没有找到相关内容,似乎与Storyboard有些相似,但我不懂Storyboard。
我的第一个视图控制器(firstVC):
protocol DataDelegate {
    func getWord(word: String)
}
class MainViewController: UIViewController {
    let mainView = MainView()
    var delegate: DataDelegate?
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view = mainView
        addTargets()
    }
    func addTargets() {
        mainView.startButton.addTarget(self, action: #selector(startGame), for: .touchUpInside)
    }
    @objc func startGame() {
        guard mainView.wordTf.text!.count > 7 else {
            print("Slishkom korotkoe slovo")
            return
        }
        let vc = GameViewController()
        vc.modalPresentationStyle = .fullScreen
        delegate?.getWord(word: mainView.wordTf.text!)
        self.present(vc, animated: true)
    }
}
我的第二个视图控制器(secondVC):
class GameViewController: UIViewController {
    let gameView = GameView()
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view = gameView
        addTargets()
    }
    func addTargets() {
        gameView.backButton.addTarget(self, action: #selector(dismissSelf), for: .touchUpInside)
    }
    @objc func dismissSelf() {
        self.dismiss(animated: true)
    }
}
extension GameViewController: DataDelegate {
    func getWord(word: String) {
        gameView.bigWord.text = word
    }
}
我没有找到类似的内容,求帮助!
英文:
Beginner in SWIFT
I have 2 ViewController and want to show in secondVC(some Label) what I wrote in firstVC(some textfield) I checked similar topics but found nothing, there is something similar with storyboard, but I don't know storyboard.
my firstVC:
protocol DataDelegate {
    func getWord(word:String)
}
class MainViewController: UIViewController {
     
    let mainView = MainView()
    var delegate: DataDelegate?
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view = mainView
        addTargets()
    }
    func addTargets() {
        mainView.startButton.addTarget(self, action: #selector(startGame), for: .touchUpInside)
    }
    
    @objc func startGame() {
        
        guard mainView.wordTf.text!.count > 7 else {
            print("Slishkom korotkoe slovo")
            return
        }
        
        let vc = GameViewController()
        vc.modalPresentationStyle = .fullScreen
        delegate?.getWord(word: mainView.wordTf.text!)
        self.present(vc, animated: true)
    }
}
my secondVC:
class GameViewController: UIViewController {
    
    let gameView = GameView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view = gameView
        addTargets()
    }
    
    func addTargets() {
       
        gameView.backButton.addTarget(self, action: #selector(dismissSelf), for: .touchUpInside)
    }
    
    @objc func dismissSelf() {
        self.dismiss(animated: true)
        
    }
}
extension GameViewController: DataDelegate {
    func getWord(word: String) {
        gameView.bigWord.text = word
    }
    
    
}
I didn't find anything similar, pls help!
答案1
得分: 0
你几乎肯定不想为此使用协议/代理模式...
一般来说,当你创建你的控制器(GameViewController)时,你希望传递数据,然后再呈现它。
在你的GameViewController中添加一个属性来接收数据(在这种情况下是一个字符串):
class GameViewController: UIViewController {
    var gameWord: String = ""
    // 你的其余代码
}
然后,在MainViewController中点击一个按钮来调用startGame()时:
@objc func startGame() {
    
    guard theWord = mainView.wordTf.text, theWord.count > 7 else {
        print("Slishkom korotkoe slovo")
        return
    }
    
    let vc = GameViewController()
    vc.modalPresentationStyle = .fullScreen
    // 在这里“传递”数据
    vc.gameWord = theWord
    self.present(vc, animated: true)
}
现在,你已经将在wordTf中输入的文本设置为你的游戏视图控制器中的gameWord,你可以按照你的需要使用它。
英文:
You almost certainly do NOT want to use protocol/delegate pattern for this...
In general, you want to pass data to your presented controller (your GameViewController) when you create it, and then present it.
Add a property to your GameViewController to receive the data (a string, in this case):
class GameViewController: UIViewController {
    var gameWord: String = ""
    // all the rest of your code
}
Then, when you tap a button in MainViewController to call startGame():
@objc func startGame() {
    
    guard theWord = mainView.wordTf.text, theWord.count > 7 else {
        print("Slishkom korotkoe slovo")
        return
    }
    
    let vc = GameViewController()
    vc.modalPresentationStyle = .fullScreen
    // "pass" the data here
    vc.gameWord = theWord
    self.present(vc, animated: true)
}
You now have the text entered into wordTf set as gameWord in your game view controller, and you can use it however you want.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论