在多个 NSView 中使用单个 NSTextField

Using single NSTextField in multiple NSViews

我有三个 NSView(我们称它们为 "main"、"one" 和 "two")。 "main" 视图充当 "one" 和 "two" 的容器,它们是子视图:

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

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

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

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

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

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

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

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 对其进行了初始化,一切正常。