从另一个类的UITextField访问文本

时间:2016-08-11 12:43:37

标签: ios swift parse-platform uitextfield

我想从单独的类中的UITextField中提取用户输入文本,以便将其保存到我的解析数据库中。当我尝试保存数据库时,名称字符串显示为空。

我从此视图控制器中提取文本

class ProfileViewController: UIViewController, UITextFieldDelegate {


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

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

我想用这个类保存它

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

有关如何使用SaveName类进行保存的任何建议吗?

4 个答案:

答案 0 :(得分:0)

我认为你应该稍微改变你的方法lke this:

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

然后像这样调用你的方法:

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

答案 1 :(得分:0)

SaveName中你没有使用实际的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的文本字段条目。以后不能访问它。

答案 2 :(得分:0)

那么, 你写的事实: Name = ProfileViewController()。name!.text!

实际创建一个ProfileViewController并尝试获取名称,这是一个空字符串,因为您没有显示屏幕,因此用户无法输入。

所以你想要做的是:   - 呈现ProfileViewController   - 让用户在文本字段中键入其名称   - 按下确定按钮或其他任何内容后,从配置文件视图控制器中获取文本。

展示ProfileViewController

你可以使用,从你的SaveName类(不幸的命名,ViewController的子类名称应该以ViewController结束):

[self presentViewController:[[ProfileViewController alloc] init]                  动画:YES                  完成:无];

2-让用户在文本字段中输入他们的名字

这里没什么可做的。

3-取回名字

这样做的最佳方式是使用委托模式,但是,在swift中,您可以在视图控制器中添加一个闭包,以便在单击ok / cancel按钮时知道该怎么做,并设置它在呈现视图控制器之前。

结果大概是:

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

答案 3 :(得分: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()
    }
  }
}

感谢所有回复,希望这有助于其他人坚持这一点。