我想从单独的类中的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类进行保存的任何建议吗?
答案 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,当然是空的,因为它是新的。
相反,假设您的原始ProfileViewController
和SaveName
位于同一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()
}
}
}
感谢所有回复,希望这有助于其他人坚持这一点。