在 macOS 应用程序中,我试图弹出一个工作表弹出窗口,用户可以在其中输入文本。用户添加文本后,他们单击“保存”关闭工作表并将文本添加到之前的页面 NSTextView。我已经尝试了很多变体,但老实说,我什至不确定如何在两个 ViewController 之间传递数据。我已经尝试过 PerformSegue,它似乎仅适用于 iOS。我也试过保存到 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,它永远不会到达它。任何帮助将不胜感激。我真的很想在这里学习,我用谷歌搜索了所有我能找到的解决方案。
最后,如果我这样做完全错误并且有更好的方法请告诉我。
最佳答案
如果你想在 View Controller 之间传递数据,你需要在第二个 View Controller 中有一个变量可以接受你想传递的内容。然后,您需要在准备 segue 时发送它。
例如,这显示了在点击 goToNext 时将数据从 firstVC 传递到 secondVC(我在这里制作了一个导航按钮)
第一VC
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)
}
}
}
第二VC
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
}
关于 swift 4 : Issues passing data from one NSViewController to another,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49215783/