Objective c 在Cocoa中使用许多接口元素

Objective c 在Cocoa中使用许多接口元素,objective-c,cocoa,interface,elements,Objective C,Cocoa,Interface,Elements,我的应用程序需要一个有许多按钮、文本字段和矩阵的界面。他们需要不时地改变。现在,我已经在IB中拥有了所有元素,并在需要时隐藏/显示/移动它们。其他人会推荐什么?我应该那样做吗?我应该使用NSTabView吗?NSView?是否应该以编程方式创建元素?如果是这样的话,如果我有一个已经创建的元素,并且我需要它而不做任何更改,该怎么办?释放它并重新创建它是一种浪费 任何帮助都将不胜感激。您目前的方法听起来不错。如果您正在显示/隐藏它们,但在其他方面它们保持不变,那么当您的XIB保存了一份您已经需要的“

我的应用程序需要一个有许多按钮、文本字段和矩阵的界面。他们需要不时地改变。现在,我已经在IB中拥有了所有元素,并在需要时隐藏/显示/移动它们。其他人会推荐什么?我应该那样做吗?我应该使用NSTabView吗?NSView?是否应该以编程方式创建元素?如果是这样的话,如果我有一个已经创建的元素,并且我需要它而不做任何更改,该怎么办?释放它并重新创建它是一种浪费


任何帮助都将不胜感激。

您目前的方法听起来不错。如果您正在显示/隐藏它们,但在其他方面它们保持不变,那么当您的XIB保存了一份您已经需要的“冻干”副本时,为什么还要费劲用代码创建它们呢

只要将它们保留在逻辑组中,就可以移动/交换/显示/隐藏组的容器(如NSBox或NSView)。如果您有很多逻辑组,它们并不总是在每个会话中显示,那么您可以将它们分离到自己的XIB中,并仅在需要时加载它们,以节省启动时间和内存


如果您使用NSViewController,它会更好,因为您可以为每个逻辑组进行完全中断。加载面板,因为视图和视图控制器将保持出口/动作,并且与xib有一对一的关系。

在我看来,如果必须围绕大量视图设置动画,最好以编程方式创建接口。如果只是隐藏/取消隐藏它们的问题,IB工作得很好,但是如果您需要重新布局或动态创建未知数量的视图,则不值得尝试使用nib文件来实现所有功能

至于一般意见:

  • 为要使用的每种元素创建子类(从
    UIView
    UIControl
    或其子类之一)。从
    UIViewController
    中拼凑组合视图是很有诱惑力的,但是创建真正的类确实会让您受益匪浅

  • 研究标准的Cocoa视图类,并尝试在自己的控件和视图中创建类似的API:s

  • 将尽可能多的数据(子元素定位等)放入plist,这样您就可以轻松地从一个集中的位置更改它,而不必在代码中到处翻找


如果您经常创建几十个短期视图,那么将它们保存在一个池中并重用它们是值得的。但如果只是偶尔添加和删除一些标签,我就不会太担心了。像往常一样:不要过早优化。

OP声明“发布并重新创建它将是一种浪费。”在我看来,提前加载所有变体并将其保存在内存中以备需要,比在需要时创建所需变体要浪费得多。@mbmcavoy有时是浪费,有时(通常)不是。在任何情况下,都不会“提前加载所有变体”。而是在创建对象时将对象添加到池中,并在从接口中删除对象时将其标记为未使用。(或者只在移除它们时将它们移动到池中。)如果您注意到大多数对象已经很长时间没有被使用,甚至可以刷新池(但在这种情况下,您可能一开始就不需要池)。“但是如果只是偶尔添加和移除一些标签,我不会太担心。”很抱歉我在这里产生误解,但你的意思是我应该取消分配它们还是重新使用它们?(在只是改变小事情的情况下)在不了解更多情况的情况下很难说。如果基本上是同一组控件/视图,只需要不时调整,那么最好将它们保留在固定结构中(而不是池中)。但是,如果界面更加流畅,并且生成了新的元素星座,那么您应该释放并忘记视图,稍后再创建新的视图,除非这成为真正的性能瓶颈,在这种情况下,您应该使用池。大约有30种变化。。有时只是标题,有时是框架,有时删除元素。。我不确定重新分配和创建是否会是一个大问题。。(我还没有做任何真正的测试来看看它发生的速度)。我有很多逻辑组(~30)。现在,我的组共享从一开始就在IB中的相同按钮,但如果需要,它们会更改它。我这样做没有任何视图,只是在我的窗口上的一堆元素。但是如果我有所有这些视图,那么可能最好通过编程方式创建/删除它们?因为视图不能共享同一个按钮。。。我对NSViewController了解不多,所以我真的不知道它能做什么。我将来必须对自己进行教育。