2014-11-30 3 views
0

위임을 사용하여보기 컨트롤러에서 정보를 다시 전달하고 있습니다. 이 함수가 호출되는 방법메서드 내에서 레이블 텍스트 변경

func writeValueBack(value: String) { 
    self.label.text = value 
} 

하고 모든 업데이트하지 않습니다 떨어져 레이블에서 중대하다.

은 레이블에 값이와 전무를 반환하지 않습니다

, 나는 그것은

그래서 그 레이블의 텍스트로 설정되고 있음을 의미한다 '값'의 값을 출력이 줄

println(self.label.text) 

로 확인 'value'하지만 업데이트되지 않습니다.

나는 심지어 메인 스레드하지만 행운

func writeValueBack(value: String) { 
    dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     self.label.text = value 
    }) 
} 

난 그냥 문제가 무엇인지 모르는를 사용했습니다.

도움이 될 것입니다.

프로토콜 :

protocol writeValueBackDelegate { 
func writeValueBack(value: String) 
} 

편집 :

// 
// ViewController.swift 
// DelegateTesting 
// 
// Created by Alex Catchpole on 30/11/2014. 
// Copyright (c) 2014 Alex Catchpole. All rights reserved. 
// 

import UIKit 

class ViewController: UIViewController, writeValueBackDelegate { 
@IBOutlet weak var label: UILabel! 
@IBOutlet weak var textField: UITextField! 


override func viewDidLoad() { 
    super.viewDidLoad() 
} 

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

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "MainSegue" { 
     var vc = segue.destinationViewController as SecondViewController 
     vc.labelText = textField.text 
     vc.delegate = self 
    } 
} 

func writeValueBack(value: String) { 
    dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     self.label.text = value 
    }) 
} 


@IBAction func button(sender: AnyObject) { 
    self.label.text = textField.text 
} 

@IBAction func segue(sender: AnyObject) { 
    performSegueWithIdentifier("MainSegue", sender: self) 

} 

}

두 번째의 ViewController 소스 :

// 
// SecondViewController.swift 
// DelegateTesting 
// 
// Created by Alex Catchpole on 30/11/2014. 
// Copyright (c) 2014 Alex Catchpole. All rights reserved. 
// 

import UIKit 

class SecondViewController: UIViewController { 
@IBOutlet weak var label: UILabel! 
@IBOutlet weak var textField: UITextField! 

var labelText: String! 
var delegate: writeValueBackDelegate? = nil 

override func viewDidLoad() { 
    super.viewDidLoad() 
    label.text = labelText 

    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 
@IBAction func button(sender: AnyObject) { 
    label.text = textField.text 
} 


@IBAction func segueBack(sender: AnyObject) { 
    var editedText = label.text 
    performSegueWithIdentifier("SecondSegue", sender: self) 
    if (delegate != nil) { 
     delegate?.writeValueBack(editedText) 
     println("working") 
    } 
} 
} 
+0

는'UILabel'을 self.label''인 writeValueBackDelegate 선언과 관련 변수의 writeValueBack 방법과 두 번째 뷰 컨트롤러의 segueBack 방법을 제거 할 수 있습니다 또는'UIButton'? – pwightman

+0

버튼이 아니라 UILabel입니다. –

+0

그냥 추가하면 아무것도 업데이트되지 않습니다. textField의 텍스트를 같은 방법으로 설정하려고 시도했지만 아무 것도하지 않았습니다. 값이 적용되지만 UI 요소가 업데이트되지 않습니다. –

답변

1

내보기 컨트롤러 코드 문제는 rdelmar가 지적한대로 두 번째보기 컨트롤러에서 원래 인스턴스로 다시 이동하는 대신 첫 번째보기 컨트롤러의 새 인스턴스를 만듭니다.

이 문제를 해결하려면 두 번째 섹을 수행하는 대신 dismissViewControllerAnimated:completion을 사용할 수 있습니다. 그러나 풀림 SEGUE는 간단한 코드로 이어질 것이며, 첫 번째 뷰 컨트롤러에이를 추가함으로써 달성 될 수있다 :

@IBAction func unwindFromSecond(unwindSegue: UIStoryboardSegue) { 
    if let secondViewController = unwindSegue.sourceViewController as? SecondViewController { 
     label.text = secondViewController.label.text 
     // Or whatever you need to retrieve data from the second controller 
    } 
} 

그런 다음 스토리 보드의 두 번째 뷰 컨트롤러에서 언 와인드 SEGUE을 만들 수 있습니다. 예를 들어 Dismiss 버튼이있는 경우이 버튼에서 두 번째보기 컨트롤러 장면의 Exit 아이콘으로 control- 드래그하고 unwindFromSecond을 선택합니다. 자세한 단계는이 다른 질문에 대한 답변을 참조하십시오 : What are Unwind segues for and how do you use them?

는 이제

관련 문제