如何通过委托将信息从键盘视图控制器传递到主视图控制器

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


【讨论】:

以上是关于如何通过委托将信息从键盘视图控制器传递到主视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

使用委托从按钮传递信息以突出显示单元格

如何使用委托将数据从多个视图控制器传递回根视图控制器? IOS 7

响应者链但不是委托属性将值从容器传递回视图控制器

通过视图控制器将委托传递给视图控制器

如何将核心数据信息从表视图传递到视图控制器?

如何在快速在 textFieldDidBeginEditing 委托上呈现另一个视图控制器时隐藏键盘?