2016-11-11 7 views
0

Tab View Controllerを中心に構築されたiOSアプリケーションで作業しています。 「連絡先」タブを作成しました。ここで、ユーザーはリストから連絡先を見つけて選択できます。ユーザーが連絡先を選択すると、連絡先の名前が使用され、別のタブにその連絡先の名前が渡されます。その機能は次のように行われています。Tab View ControllerでSegueが値を保持し続ける

これまでのように(テキストフィールドに名前が読み込まれていれば)すべて動作します。私の問題は、タブを変更してから[ホーム]タブに戻るたびに値が戻ってくるようです。たとえば、連絡先から「John」を選択すると、「ホーム」タブに移動し、Johnの名前をテキストフィールドに入力します。名前の最後の2文字を削除したとしましょう。今は "Jo"です。別のタブを読み込んで戻ると、名前フィールドが「John」にリセットされました。これは、ホームタブを開くたびに値が再渡されるかのようです。また、名前を渡した後にホームタブを読み込むたびに、私のコンソールに「Name Passed: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メソッドで呼び出されているが、本質的にデータが[連絡先]タブから一度だけ渡されているので意味がありません。ありがとう!

答えて

0

"passedName"変数は、UITextFieldで編集するたびに値が変更されないという問題があります。タブを変更するたびに、UIViewControllerはviewWillAppearとviewDidAppearを呼び出します。したがって、UITextFieldは、他のタブを選択して戻ると、常にpassedName値を表示します。

テキストフィールドを編集するたびにpassedName値を更新することをお勧めします。

私の悪い英語のために申し訳ありません。

+0

ありがとう!ただし、passedName値を更新すると、タブを変更して戻ったときにオーバーライドされませんか? viewDidLoadにコードを配置すると、これが変わる可能性がありますか? – JD2017

+0

いいえ、viewDidLoadに入れないでください。なぜなら、そのタブに戻るたびに呼び出されるわけではないからです。 UiTextFieldを変更すると、viewWillAppearになり、passedNameを更新し続けます。 –

+0

Rightが、ホームタブをロードするたびにpassedNameが更新されます。だから私はそれを変更し、値を更新するかどうかにかかわらず、私はタブを切り替えて戻ってくると、それはパス値によってオーバーライドされます – JD2017

0

問題は、実際に値を元のビューに戻さないということです。クラス間で情報を渡すAppleの推奨事項は、デリゲートパターンを使用することです。これにより、モーダルビューはデリゲートクラスの関数を呼び出すことができます。この関数は、元のビューのviewControllerでその関数が宣言されているため、元のビューのローカルに名前を変更します。パターンin this tutorialの詳細については読むことができますが、以下の使用例に関連する簡単な例も示しました。

mainViewController:

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) 
    } 
} 

editNameViewController:

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 editNameDetailsViewControllerDelegate : class { 
    func personDetailsView(n: String, controller: UIViewController) 
} 

・ホープ、このことができます。

+0

ありがとうございました!私の唯一の問題は、このソリューションがTab Bar Controllerで動作するとは思わないということです。私はタブバーコントローラを持っており、タブの個々のビューはナビゲーションコントローラに埋め込まれています – JD2017

関連する問題