2016-11-17 8 views
1

私は簡単な登録ストーリーボードを使ってユーザーに自分の名前などを尋ねています。入力されたデータをUITextfieldとして収集し、すべてを最終的なviewcontrollerに渡して、それをサーバに送ります。 JSONはテストデータが追加された状態で正常に動作しています。ViewControllerからViewControllerにNSDictとして変数を渡す

BaseViewController

struct NewUserStruct { 
    var firstName: String 
    var lastName: String 
} 

これはコンパイルが、私はプリント(NEWUSER)についてはnilの値を取得し、それを印刷しVC

let firstNameReg = inputFirstName.text 
    let lastNameReg = inputLastName.text 

    func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let destVC = segue.destination as? RegistrationUpdateViewController { 
      let newuser = NewUserStruct(firstName: firstNameReg! , lastName: lastNameReg!) 
      print(newuser) 
      destVC.newuser = newuser 
     }  } 

と受信VC

var newuser: NewUserStruct? 
func createUser(){ 

guard let user = self.newuser else { 
print("User is not set") 
return 
} 

let service = "registration" 
let parameters: [String: Any] = ["firstName": user.firstName, 
           "lastName": user.lastName, 
           "email": "[email protected]", 
           "password": "12345678", 
           "region": "EU", 
           "bundleId": Bundle.main.bundleIdentifier!, 
           "appVersion": Bundle.main.infoDictionary?["CFBundleVersion"] as! String] 

を送信ガード "ユーザーが設定されていません"

これは、あなたが渡しているデータの適切な定義を持っているように、私は構造体を使用することになり、私の全体のVC

import Foundation 
import UIKit 

class RegistrationNameViewController: BaseViewController { 

@IBOutlet var inputFirstName: UITextField! 
@IBOutlet var inputLastName: UITextField! 



override func setup() { 

} 

override func navbarTitle() -> String { 
    return "Name" 
} 

override func leftNavbarButtonType() -> NavbarButtonType { 
    return NavbarButtonType.eNavbarButtonTypeBack 
} 

override func rightNavbarButtonType() -> NavbarButtonType { 
    return NavbarButtonType.eNavbarButtonTypeNext 

} 

override func navbarViewNextPressed(_ navbarView: NavbarView) { 
    let firstNameReg = inputFirstName.text 
    let lastNameReg = inputLastName.text 
    print(inputFirstName.text!,inputLastName.text!) 

    func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let destVC = segue.destination as? RegistrationUpdateViewController { 
      print(destVC) 
      let newuser = NewUserStruct(firstName: firstNameReg! , lastName: lastNameReg!) 
      print(newuser) 
      destVC.newuser = newuser 
     }  } 
    self.performSegue(withIdentifier: "NameToEmail", sender: nil) 

} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

} 
+0

あなたはスウィフトを使用しているのでNSDictionaryではなく、Dictionaryを使用する必要があります。受け取る辞書は 'Name2Array'ではなく' NameVars'であるようです。変数には大文字で名前を付けるべきではなく、構造体を使用して辞書ではなくデータを渡すべきです – Paulw11

+0

最終的には、最終的なviewcontrollerに変数が追加されるように名前を変更しました。 NSDictionary = self.receiveItemとし、let NameVars:NSDictionary = self.receiveItem また、私はキャップを変更します。辞書ではなくStructsを使用する理由はありますか?私はその違いを完全に理解していません。私は既存のコードを使用しています。その理由は、その辞書ではなくNSDictionaryです。ありがとう! – Thegasman2000

+0

辞書の問題は、それが不正確であることです。あなたはキーの値を知る必要があり、単純なタイプミスをすると物事が壊れるでしょう。もしあなたが構造体を使うならば、コンパイラはオートコンプリートを提供し、属性が何であるかをより定義します。 NSDictionaryは素早い辞書にブリッジされます – Paulw11

答えて

0

です。

struct NewUser { 
    var firstName: String 
    var lastName: String 
} 

今、あなたは、この構造体のインスタンスを作成し、先のビューコントローラでprepare(for segue:)

override func navbarViewNextPressed(_ navbarView: NavbarView) { 
    guard let firstName = inputFirstName.text where !firstName.isEmpty 
      let lastName = inputLastName.text where !lastName.isEmpty else { 
     print("first name and last name are required") 
     return 
    } 

    let newUser = NewUser(firstName: firstName, lastName: lastName) 

    self.performSegue(withIdentifier: "NameToEmail", sender: newUser) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let destVC = segue.destination as? RegistrationUpdateViewController { 
     print(destVC) 
     if let newuser = sender as? NewUser { 
      print(newuser) 
      destVC.newuser = newuser 
     } 
    } 
} 

であなたの先のビューコントローラにそれを渡すことができます:

class RegistrationUpdateViewController { 
    var user: NewUser? 

    func someFunction { 
     guard let user = self.user else { 
      print("User is not set") 
      return 
     } 

     let service = "registration" 
     let parameters: [String: Any] = ["firstName": user.firstName, 
             "lastName": user.lastName, 
             "email": "[email protected]", 
             "password": "12345678", 
             "region": "EU", 
             "bundleId": Bundle.main.bundleIdentifier!, 
             "appVersion": Bundle.main.infoDictionary?["CFBundleVersion"] as! String] 
    ... 
    } 

} 
+0

ありがとうございました! – Thegasman2000

+0

私はとても近いです。私の現在の問題は、私のViewcontrollerがこれを持っているということです。 let firstNameReg = inputFirstNameです。テキスト がlastNameReg = inputLastName.text せNEWUSER = NEWUSER(:firstNameReg!lastNameの:!firstNameのlastNameReg)しましょう プリント(NEWUSER) プリント(NewUser.self) それはNEWUSERの罰金を印刷しますが、NEWUSERはnilです。受信VCでコードが実行されると、ガード「User is not set」がそのnilとしてヒットしますか?混乱した顔。 (BaseUserControllerでUserを使用していたNewUserの名前を変更する必要がありました!) – Thegasman2000

+0

Destination View Controllerでプロパティを割り当てていないようです。あなたのセグーコードの実行は準備されていますか? – Paulw11

関連する問題