【问题标题】:How to change NSTextField value from another NSView (different swift files)如何从另一个 NSView 更改 NSTextField 值(不同的 swift 文件)
【发布时间】:2016-03-18 14:15:55
【问题描述】:

我有两个不同的 NSViews
viewAViewA.swift
viewB 控制> 由 ViewB.swift 控制
我想将 viewB 中的 textField (NSTextField) 从 viewA强>。

我通过从 viewA 创建一个 viewB 的实例来更改它,但是我得到一个错误

这是我在 viewA 中创建实例的方式:

let myViewB = ViewB()
myViewB.changeValue = myString

viewB 我声明:

var myString = "" {
    didSet {
        myNSTextField.stringValue(myString)
    }
}

这是我在更改 NSTextField 值时遇到的错误:

在展开可选值时意外发现 nil



更新:

文件 ViewB.swift

class ViewB: NSView {
    ...
    @IBOutlet weak var widthTextField: NSTextField!
    ...
}

文件 ViewA.swift

 let myViewB = ViewB()

 class ViewA: NSView {
     ...
     if *statement* {
          ....
          myViewB.widthTextField.stringValue("try") // <- here i get the error
          ....
     }
     ...
}

【问题讨论】:

  • 我最近在这里回答了这样一个问题:stackoverflow.com/questions/35994684/…
  • 所以我应该在课堂之外使用let myViewB = ChooseEdit()。但我得到了同样的错误。
  • 不,您应该生成一个属于您的 CLASS 对象(类似于 var myViewB = viewB() ),然后您可以通过 var textfield = myviewB.myNSTextField 访问 viewB 在 a 类中的属性
  • 谢谢你的回答,我就是这样做的。但它仍然给我错误
  • 你能更新问题并添加你现在拥有的所有代码吗?

标签: swift macos nsview nstextfield


【解决方案1】:

我终于修好了!我创建了一个变量,其中包含需要将其更改为这样的文本:(使用您的测试项目)

在 ViewA 类中

    import Cocoa

var textToSet = "Hello"

class ViewA: NSView {
    override func drawRect(dirtyRect: NSRect) {
        super.drawRect(dirtyRect)

        // Drawing code here.
    }

    @IBAction func editPressed(sender: AnyObject) {
        textToSet = "No"
    }

}

在 ViewB 类中

import Cocoa

class ViewB: NSView{

    @IBOutlet var myTextField: NSTextField!
    override func drawRect(dirtyRect: NSRect) {
        super.drawRect(dirtyRect)

        myTextField.stringValue = textToSet
        // Drawing code here.
    }

}

【讨论】:

  • 谢谢,我需要文本字段的实时更新(现在可以了)。我不知道为什么它在我的项目中仍然不起作用。执行此操作后,我无法在 NSTextField 中输入任何内容。稍后我会试试的。
  • 这可能是因为您禁用了文本编辑,这与此无关
  • 没有。当我在我的项目中添加myTextField.stringValue = textToSet 时,我无法编辑文本字段。我不知道为什么。我评论了我的代码中的所有内容。仍然有这个问题。我创建了另一个 NSTextField,我仍然遇到这个问题。
  • 尝试添加另一个 NSTextField 并执行与另一个相同的操作。即使在我上传的项目中,您也会遇到问题。
  • 我遇到了问题。我必须添加 override func controlTextDidChange(obj: NSNotification) { textToSet = myTextField.stringValue } 以便更新字符串。感谢您的帮助。
【解决方案2】:

在您的代码中,您生成一个新的 stringValue 对象(我认为)。它是这样工作的吗?

class ViewB: NSView {
    @IBOutlet weak var widthTextField: NSTextField!
}
let myViewB = ViewB()

class ViewA: NSView {
    if *statement* {
        myViewB.widthTextField.stringValue = "try" //setting it "try" without recreating the stringValue (done by "()")
    }

}

【讨论】:

  • 感谢您的回复。即使myViewB.widthTextField.stringValue = "try" 也有同样的问题
  • 它在哪一行崩溃?确切的错误是什么?如果你把widthTextField.stringValue = "try" 放在ViewA 类中,那么它会起作用吗?
  • 是的,它有效。它在您答案的最后一行崩溃。我尝试创建另一个项目:dl.dropboxusercontent.com/u/43867401/editTextField.zip 当您启动项目时展开窗口以查看两个视图。
  • 我在我的新答案中使用了一种解决方法!
猜你喜欢
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多