【问题标题】:Using single NSTextField in multiple NSViews在多个 NSView 中使用单个 NSTextField
【发布时间】:2015-10-11 17:53:23
【问题描述】:

我有三个 NSView(我们称它们为“main”、“one”和“two”)。 “主”视图充当“一”和“二”子视图的容器:

[main addSubview:one];
... 
// "one" gets replaced by "two" at a later point
...
[main replaceSubview:one with:two];

我遇到的问题是NSTextField 驻留在“一”上,我也想出现在“二”上,所以当“一”被替换时它就在那里。问题是我似乎无法弄清楚如何引用或复制NSTextField,以便它可以出现在两个视图上并被两者使用。

是否可以在多个NSViews中使用相同的NSTextField

【问题讨论】:

  • mainonetwo 是否属于同一类?每个视图只能看到与其在同一类中的引用插座。
  • main 有它自己的NSView 子类,onetwo 一起在AppDelegate 中作为NSViews,它包含main 视图子类。
  • 所以mainNSView 的子类,而onetwo 是常规NSViews?
  • 同一个instance不能在两个地方。同一个类的两个不同的实例可以在两个地方,但不能是同一个实例。为什么你甚至认为你需要这个?

标签: objective-c xcode macos cocoa-touch nsview


【解决方案1】:

我并不完全清楚您要实现的目标,但是:不,视图不可能位于两个不同的超级视图中。一个视图只有一个超级视图。视图层次结构严格来说是一个树结构。

当然,您可以创建两个相同的文本字段以显示在视图层次结构的两个位置。但是,如果您稍后对其中一个进行更改并希望它们保持相同,则必须对另一个进行相同的更改。

您还可以从一个超级视图中删除文本字段,并在运行时将其添加到另一个,例如当您从一个视图切换到另一个视图时。如果您使用的是自动布局,那可能会很烦人,因为从视图层次结构中删除视图也会删除它与其父视图和兄弟视图之间的任何约束。当您将文本字段放入新的超级视图时,您必须重新创建适当的约束。

最后,一个插座只能指单一视图。也就是说,出口是一个对象指针,因此一次只能引用一个对象。如果您有两个单独的文本字段(即使配置相同)并且想从代码中引用它们,则需要两个单独的 outlet。

【讨论】:

  • 我认为他想要的是某种能够始终为他们提供相同内容的绑定。但是我已经很久没有为 Mac OS X 编程了,以至于我不记得该怎么做......
  • 实际上,它是“她”:),但是是的,我希望主视图的子视图包含一个与 matt 提到的内容相同的 nstextfield。目前我正在努力做到这一点,但为每个子视图创建了完全不同的 nstextfields,这是一个巨大的痛苦。
  • mainview(nsview 子类)-> nstextfield(在子视图一上)->(希望在子视图二上使用相同的 nstextfield)。
  • 如果您只想要具有相同内容的文本字段,您可以通过多种方式实现。一种方法是为两个单独的文本字段设置两个出口,并且每当您设置一个的内容(例如stringValue)时,在另一个上设置相同的内容。另一种方法是使用绑定,并将两个文本字段的值绑定绑定到相同的控制器和键路径。
【解决方案2】:

Duh,答案就在我眼前……

NSRect textRect = NSMakeRect(0,0,200,22); // X, Y, W, H
NSTextField *text = [[NSTextField alloc] initWithFrame:textRect];

[text setStringValue:[NSString stringWithFormat:@"foobar"]];

[main addSubview:one];
[one addSubview:text];
... 
// "one" gets replaced by "two" at a later point
...
[main replaceSubview:one with:two];
[two addSubview:text]

我刚刚使用了NSMakeRect 并使用NSTextField 对其进行了初始化,一切都很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多