Swift 4:将数据从一个NSViewController传递到另一个NSViewController的问题

时间:2018-03-11 01:34:35

标签: swift nstextview nsviewcontroller nsmutablestring nstextstorage

在macOS应用程序中,我尝试使用工作表弹出窗口,用户可以在其中输入文本。一旦用户添加了文本,他们就会单击保存关闭工作表并将文本添加到之前的页面NSTextView。我尝试了很多这方面的变化,但老实说,我甚至不确定如何在两个ViewControllers之间传递数据。我尝试过看起来只是iOS的PerformSegue。我也尝试保存到UserDefaults()。string(forKey:“”),但似乎没有任何效果。最后,我遇到了一种方法来引用另一个ViewController类,然后从该类运行一个函数,但它似乎没有工作。这是我到目前为止的代码(我试图添加所有相关的代码,如果有什么东西丢失让我知道)。

这是连接到View的ViewContoller我要将文本添加到。

class NotesViewController: NSViewController {

override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect)
}

@IBOutlet var notesTextView: NSTextView!

func updateCaseTemplate(template: Any) {
    notesTextView.textStorage?.mutableString.setString(template as! String)
}

这是我试图获取用户文本的ViewController。

class TemplateViewController: NSViewController {

private var notesView: NotesViewController?

@IBOutlet weak var notesTemplateTextView: NSTextView!


@IBAction func saveNotesTemplate(_ sender: Any) {
    var notesTemplate = notesTemplateTextView.textStorage?.mutableString
    notesView?.updateCaseTemplate(template: notesTemplate!)
    dismissViewController(self)
}


}

我可以在saveNotesTemplate中运行一个print(notesTemplate!),它显示来自NSTextView的正确文本!如果我在func updateCaseTemplate()上放置一个Break,它永远不会到达它。任何帮助将不胜感激。我真的想在这里学习,我已经谷歌了所有我可以尝试找到解决方案。

最后,如果这样做完全错误并且有更好的方法请告诉我。

1 个答案:

答案 0 :(得分:1)

如果要在视图控制器之间传递数据,则需要在第二个视图控制器中有一个可以获取想要传递的内容的变量。然后,您需要在准备segue时发送它。

例如,这显示当点击goToNext时我将数据从firstVC传递到secondVC(我在这里制作了一个导航按钮)

<强> FirstVC

import UIKit

class FirstVC: UIViewController {

// MARK: - Properties
var user: UserProfile? // build it from a function
var note: Note?  // build or use none

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)

    getUser()
    if note == nil {
        getNote()   
    }
    setupStack()
}
override func viewDidLoad(_ animated: Bool) {
    super.viewDidLoad(true)

    makeBarItems()
    setupStack()
}

// MARK: - Setup

func makeBarItems(){

    navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(named:"list-fat-7"), style: .plain, target: self, action: #selector(goToNextTapped))
}

func setupStack() {
// maybe you have data in a stack
}

@objc func goToNextTapped (){
    print("goToNextTapped")

    let detailVC: SecondVC? = SecondVC()

    if detailVC != nil {
        print("setting up secondVC")
        detailVC?.modalPresentationStyle = .overCurrentContext

        detailVC?.note = selectedNote
        detailVC?.user = user!

        present(detailVC!, animated: true, completion: nil)
    }
}
}

<强> SecondVC

import UIKit

class SecondVC: UIViewController {

    // MARK: - Properties
    var user: UserProfile? // get from firstvc
    var note: Note? = "NONE" // get it from first vc or use none

    // blah rest of secondVC
    }