在多个NSView中使用单个NSTextField

时间:2015-07-22 03:17:02

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

我有三个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驻留在“一个”上,我也想在“两个”上显示,所以当“一个”被替换时它就在那里。问题是我似乎无法弄清楚如何引用或复制NSTextField,以便它可以出现在两个视图上并被两者使用。

enter image description here

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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对其进行初始化,一切都很好。