Swift从view2导航回view1

时间:2016-10-12 19:31:23

标签: ios swift uiviewcontroller

我有一个View1,其中按钮有标题,我成功传递到View2并传递了Button标题字符串,它也将被分配给View 2 Button。 现在,当用户从View2返回到View1时,View1 Button没有任何值。如何将按钮值传递给View1?

我尝试了委托方法..但没有成功:

被修改

视图1

class PatientBreifInfoViewController: UIViewController, TasksViewDelegate {

    var passName: String!

    @IBOutlet weak var patientName: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        patientName.setTitle(passName, forState: .Normal)
    }

    func setName(name: String) {
        patientName.setTitle(name, forState: .Normal)
        print("View1")
        print(name)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        if (segue.identifier == "toTasks") {
            let controller = segue.destinationViewController as! TasksViewController
            controller.delegate = self
            controller.passName = passName
        }
    }

}

视图2

protocol TasksViewDelegate: class {
    func setName(patientName: String)
}

class TasksViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var passName : String!

    @IBOutlet weak var backButton: UIButton!
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var patientName: UIButton!

    weak var delegate: TasksViewDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()

        patientName.setTitle(passName, forState: .Normal)
    }

    @IBAction func backButton(sender: AnyObject) {
        delegate!.setName(passName)
        self.navigationController?.popViewControllerAnimated(true)
    }

}

2 个答案:

答案 0 :(得分:2)

您的协议和代表应该可以正常工作。但是,您在setName中实施ViewController1并未使用传递给它的Name参数:

func setName(Name: String) 
{

    passName = patientName

} 

应改为:

func setName(Name: String) 
{

    patientName = Name

} 

您还应遵循以小写名称开头的变量,参数和函数的快速命名约定以及以大写名称开头的类型。因此,setName(name: String)不是setName(Name: String),这也意味着在示例中将patientName = Name更改为patientName = name

更新

由于您的视图控制器会在ViewController2屏幕viewDidLoad时保留在内存中,因此在从ViewController2转换为ViewController1时不会再次调用。相反,您可以直接在委托方法中设置按钮的标题。例如:

func setName(name: String)
{
    patientName.setTitle(name, forState: .Normal)
}

答案 1 :(得分:0)

popViewController(animated:)从导航堆栈中删除/弹出当前视图控制器。现在,您可以使用导航堆栈的第一个视图控制器来访问其成员。 您可能不需要在此处使用代理

试试这个,看看:

class TasksViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {



    @IBAction func backButton(sender: AnyObject) {
        self.navigationController?.popViewControllerAnimated(true)
        if let pbiViewController = self.navigationController?.viewControllers.first as? PatientBreifInfoViewController {
             pbiViewController.passName = passName
        }

    }

}


class PatientBreifInfoViewController: UIViewController {
    var passName: String?
}