如何通过委托将信息从键盘视图控制器传递到主视图控制器
Posted
技术标签:
【中文标题】如何通过委托将信息从键盘视图控制器传递到主视图控制器【英文标题】:How to pass information through delegates from a keyboardviewcontroller to the main viewcontroller 【发布时间】:2020-06-13 13:24:04 【问题描述】:我有这两个文件,tab2 和 KeyboardViewController。我正在尝试在这两个文件之间创建一个委托。
为了简单起见,我删除了一些必要的 tableView 函数。
KeyboardViewController 链接到一个名为keyboard.storyboard 的故事板 tab2 链接到另一个名为 main.storyboard 的故事板。
我想将数据从 KeyboardViewController 中名为 Lines 的列表发送到文件 tab2 并将其附加到该文件的列表中。
我的问题是程序正在运行,但是当我尝试将委托从 KeyboardViewController 发送到 tab2 时,tab2 文件不会接收到数据。 (例如,我在 textChoice 函数中的打印根本不运行)
我尝试以不同的方式启动 tab2 Viewcontroller,但没有成功。感谢您的宝贵时间。
tab2.swift
import UIKit
class tab2: UIInputViewController, UITableViewDelegate, UITableViewDataSource, icebreakerData
func textChoice(string: String)
print("textChoice is run")
likedList.append(string)
var myVC = KeyboardViewController()
var likedList: [String] = ["Hello there", "Hello there again"]
@IBOutlet var tableView: UITableView!
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
tableView.dataSource = self
tableView.delegate = self
print("INITIATING THE VCs")
myVC.iceBreakerDataDelegate = self
// this code makes the app crash when i enter site in the app
// let myVC = self.storyboard?.instantiateViewController(withIdentifier: "tab2") as? KeyboardViewController
// myVC?.iceBreakerDataDelegate = self
// navigationController!.pushViewController(myVC!, animated: true)
// self.present(myVC!, animated: true)
KeyboardViewController.swift
import UIKit
import UIKit.UIGestureRecognizerSubclass
protocol icebreakerData
func textChoice(string: String)
class KeyboardViewController: UIInputViewController, UITableViewDelegate, UITableViewDataSource
var iceBreakerDataDelegate: icebreakerData!
@IBOutlet var tableView: UITableView!
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
tableView.deselectRow(at: indexPath, animated: true)
let row = indexPath.row
print("Sending text")
self.textDocumentProxy.insertText(Lines[row])
print("DataDelegate sent")
iceBreakerDataDelegate?.textChoice(string: Lines[row])
var Lines: [String] = [
"First",
"Second",
"Third"
]
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
tableView.dataSource = self
tableView.delegate = self
【问题讨论】:
【参考方案1】:问题是参考。我可以假设 tab2
是您的初始视图控制器,并且您从中实例化 KeyboardViewController
。虽然你创造了
var myVC = KeyboardViewController()
但您可能会从另一个对象呈现/导航KeyboardViewController
。喜欢
let storyboard = UIStoryboard(name: "keyboard", bundle: nil)
let VC = storyboard.instantiateViewController(withIdentifier: "KeyboardViewController") as! KeyboardViewController
VC.iceBreakerDataDelegate = self // in this object you should conform self
present(VC, animated: true, completion: nil)
这就是你得到 nil 的原因。
或者,如果您使用的是 segue,那么您可以这样做
if(segue.identifier == "YourSegueIdentifier")
let v = segue.destinationViewController as! YourViewController
v.delegate = self
【讨论】:
以上是关于如何通过委托将信息从键盘视图控制器传递到主视图控制器的主要内容,如果未能解决你的问题,请参考以下文章