我是编码新手,即将拔头发。我设置了一个拆分视图(macOS应用程序),我只是想在左侧输入一个标签,以便在用户键入时更新为在右侧输入的文本。
我已经为这个问题苦苦挣扎了15个多小时。我已经进行了广泛的搜索,并尝试了许多解决方案(特别是在Swift3: Live UiLabel update on user input中找到的解决方案),以下是所有成功构建的尝试,但是在输入文本时都没有更改标签。
我实际上是在尝试在左侧创建类似标题的视图,其中仅列出“标题”,并且在选择后将用户带到右侧文本中的该点(这个想法是用诸如星号的标题表示标题-因此它仅显示以星号开头的文本)-但我知道其范围比一个问题大得多。
任何帮助将不胜感激。
这只是一个带有拆分视图控制器,一个文本字段和一个标签的普通Xcode文件。
注意:代码中未包含“尝试”标题,并且分别进行了测试
class ViewController: NSViewController {
@IBOutlet weak var leftLabel: NSTextField!
@IBOutlet weak var rightText: NSTextField!
override func viewDidLoad() {
super.viewDidLoad()
...
// Attempt 1
func attempt(_ sender: NSTextField) {
leftLabel.stringValue = rightText.stringValue
}
// Attempt 2
if let textInputting = rightText {
//There is a text in your textfield so we get it and put it on the label
leftLabel.stringValue = textInputting.stringValue
} else {
//textfield is nil so we can't put it on the label
print("textfield is nil")
}
// Attempt 3
func testfunc (textField: NSTextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
leftLabel.stringValue = rightText.stringValue
return true
}
// Attempt 4
func testfunc2 (textField: NSTextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
rightText2.stringValue = rightText.stringValue
return true
}
// Attempt 5
leftLabel?.stringValue = rightText?.stringValue ?? ""
// Attempt 6
func copying (_ rightText: NSTextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
leftLabel.stringValue = rightText.stringValue
return true
}
// Attempt 7
func textField(_ textField: NSTextFieldDelegate?, shouldChangeCharactersIn range: NSRange, replacementString string: NSText) -> Bool {
leftLabel.stringValue = rightText.stringValue
return true
}
答案 0 :(得分:0)
实际上,您一直试图做的并不那么简单。以前,我没有阅读整个问题。对此我感到抱歉。
以下是使用NSNotification
的一种方法,其中应用程序将从一个名为FirstViewController的视图控制器向另一个名为SecondViewController的视图控制器发送文本字符串。在下文中,HomeViewController是NSSplitViewController
的子类,在这种情况下不参与。
// HomeViewController //
import Cocoa
class HomeViewController: NSSplitViewController {
// MARK: - Variables
// MARK: - IBOutlet
// MARK: - IBAction
// MARK: - Life cycle
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
// FirstViewController //
import Cocoa
class FirstViewController: NSViewController, NSTextFieldDelegate {
// MARK: - Variables
// MARK: - IBOutlet
@IBOutlet weak var textField: NSTextField!
// MARK: - IBAction
// MARK: - Life cycle
override func viewDidLoad() {
super.viewDidLoad()
textField.delegate = self
}
func controlTextDidChange(_ notification: Notification) {
if notification.object as? NSTextField == textField {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "SecondViewControllerTextDidChange"), object: textField.stringValue)
}
}
}
// SecondViewController //
import Cocoa
class SecondViewController: NSViewController {
// MARK: - Variables
// MARK: - IBOutlet
@IBOutlet weak var labelField: NSTextField!
// MARK: - IBAction
// MARK: - Life cycle
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear() {
super.viewWillAppear()
NotificationCenter.default.addObserver(self, selector: #selector(passText), name: NSNotification.Name(rawValue: "SecondViewControllerTextDidChange"), object: nil)
}
override func viewWillDisappear() {
super.viewWillDisappear()
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "SecondViewControllerTextDidChange"), object: nil)
}
@objc func passText(notification: NSNotification) {
let text = notification.object as! String
labelField.stringValue = text
}
}
总而言之,应用程序将使用NSNotification
将字符串从FirstViewController传递给SecondViewController。 SecondViewController将通过其viewWillAppear
发布通知。当应用程序离开SecondViewController时,必须删除此通知。重要的是要注意,您需要通过Storyboard
选择每个视图控制器,并在Identity inspector
下设置类名称。