数週間前、私は this 質問し、非常に詳細な説明を得ました。ここで、最初のViewControllerにデータを渡したいのですが、同じ方法を使用すると行き詰まってしまいます。最初のVCから2番目のモーダルがあります。ここで、最初のビューに再度表示される文字列の配列を編集します。したがって、最初のビューにはデータの配列。これは2番目に渡されるため、編集フィールドに現在の情報が表示され、その後、ユーザーは配列の内容を編集して、そのデータを最初のデータに戻し、ラベルに表示されるようにする必要があります。 m Swiftを使用。
私のコード:
(ViewController.Swift :)
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
let secondVC = segue.destinationViewController as SecondViewController
secondVC.namesPlayers = self.namesPlayers
}
(SecondViewController.Swift :)
override func viewDidLoad() {
super.viewDidLoad()
labelFirstPlayer.text = namenSpelers[0]
}
ありがとうございました
デリゲートを使用する必要があります。以下は、Swiftでデリゲートを使用する方法の例です。
最初のViewControllerで、2番目のVCを読み込むときにデリゲートを設定します。
たとえば、ストーリーボードエディターを使用している場合:
var secondViewController = (segue.destinationViewController.visibleViewController as MySecondViewControllerClass)
secondViewController.delegate = self
プロトコルを記述し、値を書き戻す関数を定義します
たとえば、「Protocol.Swift」というファイルを作成し、次のように記述します。
protocol writeValueBackDelegate {
func writeValueBack(value: String)
}
FirstViewControllerに関数を追加します
func writeValueBack(value: String) {
// Or any other function you need to transport data
}
そしてあなたのViewControllerClassに
class ViewController: UIViewController, writeValueBackDelegate
プロトコルファイルで定義したViewController
にすべてのメソッドを実装していない場合、上記の行は機能しません。
2番目のビューコントローラーに移動し、デリゲートをここに追加します。
class SecondViewController: ViewController {
// Delegate for FirstViewController
// Declare as weak to avoid memory cycles
weak var delegate: writeValueBackDelegate?
}
2番目のビューコントローラーで、これを使用して最初のビューコントローラーのfuncにパスデータを呼び出すことができます。
delegate?.writeValueBack("That is a value")
これがあなたを助けることを願っています
これは、データをプッシュしたい場所から2番目のコントローラーです。 SecondView.Swift
@objc protocol returnDataProtocol {
func returnStringData(myData: String)
}
class SecondView: UIViewController {
weak var delegate: returnStringData?
@IBAction func readyButtonPressed(sender: AnyObject) {
// Do what you want here
delegate?.returnStringData("Euro/Dollar etc....")
// this function is exist in first view controller
}
}
最初のビューViewController firstView.Swift
class firstView: UIViewController, returnDataProtocol {
// this function will call to second view. You can use here Push method, if you are using navigation controller.
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "mySegue" { // your identifier here
let controller = segue.destinationViewController as! MyPopOverController
controller.delegate = self
}
}
// here you will get return value from second view controller class
func returnStringData(myData: String){
print(myData)
}
}
デリゲートを使用した答えは、必要以上に複雑に思えるため、混乱しています。これが、カードゲームで[プレーヤーの追加]ダイアログをポップアップし、その結果を呼び出し側のビューコントローラーに渡すために行ったものです。
デリゲートプロトコルを追加します(私の場合はExtensions/Protocolsファイルにあります)
protocol ReturnPlayerInfoDelegate {
func returnPlayerInfo(playerName : String, playerType : Player.Type)
}
次に、CALLEDビューコントローラーのデリゲートに(クラス変数として)参照を追加しました。これには、呼び出し元をサブクラス化したり、呼び出し先のView Controllerにプロトコルを追加したりする必要がないことに注意してください。
class AddPlayerViewController : UIViewController {
static var delegate : ReturnPlayerInfoDelegate!
私のOkボタンハンドラーでデリゲートを呼び出しました:
@IBAction func onOK(sender: UIButton) {
AddPlayerViewController.delegate.returnPlayerInfo(mPlayerName.text!, playerType: mPlayerTypeActual)
dismissViewControllerAnimated(true, completion: nil)
}
次に、CALLING ViewControllerにデリゲートを実装しました。
class FiveKings : UIViewController, UIGestureRecognizerDelegate, UIPopoverPresentationControllerDelegate ,UITextViewDelegate , ReturnPlayerInfoDelegate {
...
override func viewDidLoad() {
super.viewDidLoad()
AddPlayerViewController.delegate = self
...
func returnPlayerInfo(playerName : String, playerType : Player.Type) {
mGame.addPlayer(playerName, newPlayerClass: playerType, fKActivity: self)
}
これは非常にうまく機能します。私の実装に問題がありますか?