【发布时间】:2015-01-13 19:22:42
【问题描述】:
我正试图围绕协议和委托进行思考,但似乎遇到了一些问题。我有 2 个试图从中传递数据的 ViewController。 ViewController A 有一个文本字段,我希望有选择地从 ViewController B 填充它。所以 ViewController A 上有一个按钮可以将您转到 ViewController B 这就是我设置 B 的方式。
protocol AddPlayersViewControllerDelegate{
var playersName:String? { set get }
}
class B-Controller: UIViewController, UITableViewDelegate, UITableViewDataSource{
var addPlayerDelegate:AddPlayersViewControllerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
..etc
}
我在 viewControllers B 类中使用此代码在选择单元格时关闭 currentView
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
println("did select")
let cell = playerTableView.cellForRowAtIndexPath(indexPath)
addPlayerDelegate?.playersName? = "New Name"
if let navController = self.navigationController {
navController.popViewControllerAnimated(true)
}
}
这里不允许我在协议中设置 player Name 属性。当我从 ViewController A 检查它时,它一直返回 Nil。
视图控制器 A 如下所示:
class A-ViewController: UIViewController, UITextFieldDelegate, AddPlayersViewControllerDelegate{
var addPlayerDelegate:AddPlayersViewControllerDelegate?
}
//然后我只是想打印出在 ViewController B 中设置的新名称
覆盖 func viewWillAppear(animated: Bool) {
println("this is the selected players name \(addPlayerDelegate?.playersName)") - returns nil
}
我确信我没有完全理解某些东西,但我觉得我只是继续阅读和尝试示例,最终回到我开始的地方。
//****************************** 更新 ******************* ******//
我将尝试简化我的设置。我有 2 个视图控制器,VC-A 和 VC-B。
VC-A 有一个文本字段和一个按钮。 VC-B 有一个表格视图。我希望选择从 CB-B 的 cell.text 填充 textField,但前提是用户点击按钮查看 VC-B。所以第一次加载 VC-A 时,它应该从协议中的 playerName 字符串返回 nil,因为到目前为止还没有调用 VC-B。但是一旦用户点击 VC-A 内的按钮查看 VB-B 然后选择一个单元格,这将关闭 VC-B 并在 VC-B 类的协议内填充 playerName 字符串,然后我使用 viewWillAppear检查是否设置了 playerName 的方法,如果设置了,请使用它。这是您提供的帮助中我更新的代码。
VC-A
class FirstViewController: AddPlayersViewControllerDelegate{
var playersName:String?
let svc = LookUpViewController()
override func viewDidLoad() {
super.viewDidLoad()
svc.addPlayerDelegate = self
}
}
VC-B
protocol AddPlayersViewControllerDelegate{
var playersName:String? { set get }
}
class LookUpViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
var addPlayerDelegate: AddPlayersViewControllerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
}
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let cell = playerTableView.cellForRowAtIndexPath(indexPath)
addPlayerDelegate?.playersName = "Ziggy"
println("the name to be pass is \(addPlayerDelegate?.playersName)")
if let navController = self.navigationController {
navController.popViewControllerAnimated(true)
}
}
即使我从 VC-B 回到 VC-A,我似乎仍然是零。我想要的只是能够从 VC-B 获取一些数据(字符串)并在 VC-A 中使用它,但前提是用户使用了 VC-B 类。这有意义吗?
【问题讨论】:
标签: ios swift delegates protocols