2016-08-11 20 views
0

別のクラスのUITextFieldからユーザー入力テキストをプルして、それを自分の解析データベースに保存できるようにします。私がデータベースを保存しようとすると、名前文字列のために空になります。別のクラスのUITextFieldからテキストにアクセス

私は、このビューコントローラ

class ProfileViewController: UIViewController, UITextFieldDelegate { 


@IBOutlet weak var name: UITextField! 
var newName = String() 

@IBAction func DropLocation(sender: AnyObject){ 
    SaveName().setporta() 
} 

からテキストを引っ張っていると私はそれがSAVENAMEクラスを使用して保存するようにする方法上の任意のアドバイスこのクラスに

class SaveName: UIViewController, CLLocationManagerDelegate, UITextFieldDelegate{ 

var user = PFUser.currentUser()?.username 
var ad = PFObject(className:"Post") 
var query = PFQuery(className:"Post") 
var name = String() 


func setporta() { 
    name = ProfileViewController().name!.text! 

    query.whereKey("user", equalTo: user!) 
    query.getFirstObjectInBackgroundWithBlock() {(uobject: PFObject?, error: NSError?) -> Void in 
     if error != nil { 
      self.ad["name"] = self.name ?? NSNull() 
      self.ad.saveInBackground() 
     } else if let uobject = uobject{ 
      uobject["name"] = self.name ?? NSNull() 
      uobject.saveInBackground() 
     } 
    } 
} 

を使用してそれを保存したいですか?

私はあなたが少しこのLKEあなたの方法を変更すべきだと思う
+0

どのようにProfileViewControllerからSaveNameに移行していますか? –

+0

申し訳ありませんが、私はそれを修正しました。 Xcodeプロジェクトで正しいです。 –

+0

ボタンを使ってそのクラスを呼び出しています。私はそれを示すためにProfileViewControllerを更新しました。 –

答えて

0

だから多分私は質問をするにひどい思いますが、私の解決策は、このでした。すべての応答が、これはこれで立ち往生、誰が支援を期待するために

var newName = String() 
class ProfileViewController: UIViewController, UITextFieldDelegate { 

@IBOutlet weak var name: UITextField! 


@IBAction func DropLocation(sender: AnyObject){ 
newName = name.text! 
SaveName().setporta() 
} 

その後、私のDropLocクラスは、この

class SaveName: UIViewController, CLLocationManagerDelegate, UITextFieldDelegate{ 

var user = PFUser.currentUser()?.username 
var ad = PFObject(className:"Post") 
var query = PFQuery(className:"Post") 


func setporta() { 
name = ProfileViewController().name!.text! 

query.whereKey("user", equalTo: user!) 
query.getFirstObjectInBackgroundWithBlock() {(uobject: PFObject?, error: NSError?) -> Void in 
    if error != nil { 
     self.ad["name"] = name ?? NSNull() 
     self.ad.saveInBackground() 
    } else if let uobject = uobject{ 
     uobject["name"] = name ?? NSNull() 
     uobject.saveInBackground() 
    } 
    } 
} 

おかげのように見えました。

0

func setporta(nameFromtextField:String) { 
    name = nameFromtextField 
//rest of the code 
. 
. 
. 
} 

そして、このようなあなたのメソッドを呼び出します。何が起こることはSaveNameにあなたが実際に使用していないということです

SaveName().setporta(name!.text!) 
0

ProfileViewController。代わりに新しいインスタンスProfileViewControllerに作成しています。

これは間違ったところです。

Name = ProfileViewController().name!.text! 

ProfileViewController()それは新しいですので、もちろん、空である新しいnameのUITextFieldを持っている新しいインスタンスを作成します。

代わりに、とProfileViewControllerSaveNameが同じUINavigationControllerであると仮定すると、両方の元、あなたはviewControllersプロパティを調べて、元のUITextFieldにアクセスしようとすることができます。

たとえば、(擬似コードを付けてチェックをはずして、貼り付けはしないでください)。

func setporta() { 
    // At what index is the current view controller? 
    let currentIndex = self.navigationController.viewControllers.indexOf(self) 

    // Get the original ProfileViewController 
    let profile = self.navigationController.viewControllers[currentIndex] 

    // Get the text from the filled in UITextField 
    name = profile.name!.text! 

... snipped ... 

} 

ViewControllersがお互いについてできるだけ少しを知っている必要がありますので、これは、悪いフォームし、維持するのは難しいです。代わりに、SaveNameを画面に押し込むときは、最初にProfileViewControllerのテキストフィールド項目を渡す必要があります。後でそれにアクセスしないでください。

+0

私は基本的には同意しますが、 'SaveName()。setporta()'(より多くのオブジェクトの初期化)もやっているので、それは見知らぬ人にもなります。 –

0

まあ、 あなたが書くという事実: Name = ProfileViewController()。name!.text!

実際にProfileViewControllerを作成し、名前を取得しようとします。これは空の文字列です。スクリーンを表示していないため、ユーザーは入力できません。

だから、あなたが何をしたいです: - 提示ProfileViewController - ユーザーがテキストフィールド で、その中に自分の名前を入力する必要があります - [OK]ボタンまたは何か他のプレス時に、プロファイルからテキストを取得ビューコントローラ。

[自己presentViewController:アニメーション[[ProfileViewControllerのアロケーション]のinit] ProfileViewController

あなたSAVENAMEクラス(不幸な命名、のViewControllerで終わらなければならないのViewControllerのサブクラス名)から、使用することができます現在

:はい 完了:なし];

2 - は、ユーザーがテキストフィールドに、ここで行うことが

まああまりありませんが自分の名前を入力してもらいます。

、3-名を取得するバック

それはときに何をすべきかを知っているので、あなたにもビューコントローラへのクロージャを追加することができます迅速に、そうするデリゲートパターンを使用してだろうが、の

ベストな方法ok/cancelボタンがクリックされ、View Controllerを表示する前に設定されます。

結果はおおよそ次のようになります。

class ProfileViewController: UIViewController { 

     var completionHandler:((name:String)->Void)? 

    @IBOutlet weak var name: UITextField! 

    // var newName = String() // useless... 

    // Call this when user is done typing is name... 
    func onOKButtonClicked() -> Void 
    { 
     if let c = completionHandler 
     { 
      c(name:name.text!); 
     } 
    } 

} 

class SaveName: UIViewController{ 

    /* ... */ 

    func presentProfileViewController() -> Void 
    { 
     let pvc = ProfileViewController(); 
     pvc.completionHandler = { name in 

      self.recordName(name); 

     } 
     self.presentViewController(pvc, animated:true, completion: nil); 
    } 

    func recordName(name: String) -> Void 
    { 
     // send name to parse... 
    } 
}