2016-08-11 5 views
0

다른 클래스의 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 클래스를 사용하여 저장하는 방법에 대한 조언을 사용하여 저장하려면?

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

을 그리고 다음과 같이 당신의 메서드를 호출 :

SaveName().setporta(name!.text!) 
+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

은 당신이 약간이 아이크 귀하의 방법을 변경해야한다고 생각 ProfileViewController. 새 인스턴스ProfileViewController으로 대신 생성하고 있습니다.

여기가 잘못되었습니다. 이 새로운 때문에

Name = ProfileViewController().name!.text! 

ProfileViewController()은 물론 비어있는 새로운 name의 UITextField을 가지고 새로운 인스턴스를 생성합니다.

대신하고, ProfileViewControllerSaveName이 같은 UINavigationController에있는 가정 모두 원래, 당신은 viewControllers 속성에 보면 원래의 UITextField에 액세스하려고 할 수 있습니다.

예를 들어 (의사 코드로하고 선택하지 않으면 붙여 넣기하지 마십시오). ViewControllers가 서로에 대해 가능한 한 적은을 알고 있어야하기 때문에

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

} 

, 이 나쁜 형태 및 유지 보수가 어렵다. 대신 SaveName을 화면에 밀어 넣으면 ProfileViewController의 텍스트 입력 항목을 먼저 전달해야합니다. 나중에 액세스하지 마십시오.

0

무엇 발생하는 SaveName 당신이 실제를 사용하지 않을 것입니다

+0

나는 기본적으로 당신도 동의하지만,'SaveName(). setporta()'(더 많은 객체 초기화)를 수행하고 있기 때문에, 그것은 낯선 사람이된다. –

0

글쎄, 글을 쓰는 사실 : Name = ProfileViewController(). name! .text!

실제로 ProfileViewController를 만들고 화면을 표시하지 않으므로 빈 문자열 인 이름을 얻으려고하므로 사용자가 입력 할 수 없습니다.

그래서 당신이 원하는 무엇인가 : - 제시 ProfileViewController - 사용자가 텍스트 필드 에, 거기에 자신의 이름을 입력해야 - 확인 버튼 또는 아무것도의 보도에 따라, 프로파일에서 텍스트를 가져 뷰 컨트롤러.

[자기 presentViewController : 애니메이션 [[ProfileViewController의 ALLOC] 초기화] ProfileViewController

당신이 당신의 SaveName 클래스 (불행한 이름,의 ViewController로 끝나야의 ViewController의 하위 클래스 이름)에서 사용할 수있는 현재

: 예 완료 : 없음];

2

사용자가 여기서 할 일이 많이없는 텍스트 필드

음에 자신의 이름을 입력 되세요.

3의 이름을 얻을 다시

이 때 무엇을 알 수 있도록, 당신은뿐만 아니라 뷰 컨트롤러에 폐쇄를 추가 할 수 있습니다 빠른에 이렇게 위임 패턴을 사용하여 겠지만,의

가장 좋은 방법은 확인/취소 버튼을 클릭하고보기 컨트롤러를 표시하기 전에 설정합니다. 묻는 질문에

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... 
    } 
} 
관련 문제