我有一个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)
}
}
答案 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?
}