Swift - 委托函数没有返回值
Swift - Delegate function not returning value
VC-A 嵌入在导航控制器中,并有一个按钮通过弹出框转至 VC-B。 VC-B 有一个带有一些字体名称的 table 视图。当我 select 字体名称时,VC-B 关闭,使用 delegate/protocol,VC-A 应该得到 selected 名称。它不是。我发现如果我在 didSelectRowAt 的末尾设置断点,由于某种原因,委托为 nil。
VC-A
class ViewController: UIViewController, FontDelegate {
@IBOutlet weak var infoLabel: UILabel!
let fontTable = FontTableTableViewController()
override func viewDidLoad() {
super.viewDidLoad()
fontTable.delegate = self
}
func getFontName(data: String) {
infoLabel.text = data
}
}
VC-B
protocol FontDelegate {
func getFontName(data: String)
}
class FontTableTableViewController: UITableViewController {
let fontArray = ["Helvetica", "Arial", "Monaco"]
var delegate: FontDelegate?
// MARK: - Table view functions go here...
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let font = fontArray[indexPath.row]
self.delegate?.getFontName(data: font)
self.dismiss(animated: true, completion: nil)
}
}
这显示了从 VC-A 中的按钮到 VC-B 的故事板连接。
与其将 Pick your font
按钮链接到另一个控制器,我建议您创建按钮的 IBAction 以在按下时触发以下代码:
let storyBoard = UIStoryboard(name: "Main", bundle: nil)
guard let vc = storyBoard.instantiateViewController(withIdentifier: "FontScreen") as? FontTableTableViewController else {return}
vc.delegate = self
vc.modalPresentationStyle = .fullScreen
self.navigationController?.pushViewController(vc, animated: true)
但要使其正常工作,您需要前往 FontTableTableViewController
的身份检查员,然后您可以在 Identity
部分的 storyboardID
字段中将您的控制器命名为 FontScreen
.
这不是在导航控制器环境中 return 变量的方法。我想建议你使用 unwind segue。您的代码将如下所示:
VC一个
class ViewController: UIViewController {
var selectedFontName = ""
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func returnSelectedFont(sender: UIStoryboardSegue) {
print(selectedFontName)
}
}
VCA 中的 IBAction 也是 tableview returns 的方法,如果你使用 unwind segue。
您的 tableview 控制器看起来像这样:
VC乙
import UIKit
class FontTableTableViewController: UITableViewController {
var selectedFont = ""
let fontArray = ["Helvetica", "Arial", "Monaco"]
@IBOutlet var fontTable: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
fontTable.dataSource = self
fontTable.delegate = self
}
// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return fontArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "FontTable", for: indexPath) as! FontCell
cell.fontName.text = fontArray[indexPath.row]
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedFont = fontArray[indexPath.row]
performSegue(withIdentifier: "Return Fontname", sender: nil)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let returnVC = segue.destination as? ViewController {
returnVC.selectedFontName = selectedFont
}
}
}
为了能够让 return segue 正常工作,您必须 select tableview 单元格并控制将其拖动到 tableview 控制器中的退出图标。所以看图
在那之后你 select 展开 segue 并给它一个标识符,在 VC B 中使用。见代码。
这应该可以完美运行。
亲切的问候,
MacUserT
VC-A 嵌入在导航控制器中,并有一个按钮通过弹出框转至 VC-B。 VC-B 有一个带有一些字体名称的 table 视图。当我 select 字体名称时,VC-B 关闭,使用 delegate/protocol,VC-A 应该得到 selected 名称。它不是。我发现如果我在 didSelectRowAt 的末尾设置断点,由于某种原因,委托为 nil。
VC-A
class ViewController: UIViewController, FontDelegate {
@IBOutlet weak var infoLabel: UILabel!
let fontTable = FontTableTableViewController()
override func viewDidLoad() {
super.viewDidLoad()
fontTable.delegate = self
}
func getFontName(data: String) {
infoLabel.text = data
}
}
VC-B
protocol FontDelegate {
func getFontName(data: String)
}
class FontTableTableViewController: UITableViewController {
let fontArray = ["Helvetica", "Arial", "Monaco"]
var delegate: FontDelegate?
// MARK: - Table view functions go here...
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let font = fontArray[indexPath.row]
self.delegate?.getFontName(data: font)
self.dismiss(animated: true, completion: nil)
}
}
这显示了从 VC-A 中的按钮到 VC-B 的故事板连接。
与其将 Pick your font
按钮链接到另一个控制器,我建议您创建按钮的 IBAction 以在按下时触发以下代码:
let storyBoard = UIStoryboard(name: "Main", bundle: nil)
guard let vc = storyBoard.instantiateViewController(withIdentifier: "FontScreen") as? FontTableTableViewController else {return}
vc.delegate = self
vc.modalPresentationStyle = .fullScreen
self.navigationController?.pushViewController(vc, animated: true)
但要使其正常工作,您需要前往 FontTableTableViewController
的身份检查员,然后您可以在 Identity
部分的 storyboardID
字段中将您的控制器命名为 FontScreen
.
这不是在导航控制器环境中 return 变量的方法。我想建议你使用 unwind segue。您的代码将如下所示:
VC一个
class ViewController: UIViewController {
var selectedFontName = ""
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func returnSelectedFont(sender: UIStoryboardSegue) {
print(selectedFontName)
}
}
VCA 中的 IBAction 也是 tableview returns 的方法,如果你使用 unwind segue。
您的 tableview 控制器看起来像这样: VC乙
import UIKit
class FontTableTableViewController: UITableViewController {
var selectedFont = ""
let fontArray = ["Helvetica", "Arial", "Monaco"]
@IBOutlet var fontTable: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
fontTable.dataSource = self
fontTable.delegate = self
}
// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return fontArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "FontTable", for: indexPath) as! FontCell
cell.fontName.text = fontArray[indexPath.row]
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedFont = fontArray[indexPath.row]
performSegue(withIdentifier: "Return Fontname", sender: nil)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let returnVC = segue.destination as? ViewController {
returnVC.selectedFontName = selectedFont
}
}
}
为了能够让 return segue 正常工作,您必须 select tableview 单元格并控制将其拖动到 tableview 控制器中的退出图标。所以看图
在那之后你 select 展开 segue 并给它一个标识符,在 VC B 中使用。见代码。
这应该可以完美运行。
亲切的问候, MacUserT