2014-11-30 4 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) 
} 

EDIT: Код для моего контроллера представления:

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

ли '' self.label' в UILabel' или 'UIButton'? – pwightman

+0

Это UILabel, а не кнопка. –

+0

Просто чтобы добавить, ничего не будет обновляться. Я попытался установить текст textField тем же методом и ничего. Значение применяется, но элемент пользовательского интерфейса не обновляется. –

ответ

1

Проблема заключается в вашем втором контроллере представления, который, как указал rdelmar, создает новый экземпляр вашего первого контроллера представлений вместо перехода к исходному экземпляру.

Чтобы исправить это, вы можете использовать dismissViewControllerAnimated:completion вместо выполнения второго сеанса. Но размотки переход привел бы к более простому коду, и может быть достигнуто, добавив в свой первый контроллер представления:

@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 из второго контроллера представления. Например, если у вас есть кнопка «Отклонить», перетащите ее с этой кнопки на значок «Выход» на втором экране контроллера режима и выберите unwindFromSecond. Подробные инструкции см ответа на этот другой вопрос: What are Unwind segues for and how do you use them?

Вы можете теперь удалить writeValueBackDelegate декларации и связанные с ними переменным, методом writeValueBack и segueBack методом второго зрения контроллера

Смежные вопросы