ChatGPT解决这个技术问题 Extra ChatGPT

使用 Storyboard 自定义视图

在复杂的屏幕(视图控制器)中,我曾经将整个事物分成更小的部分(我称它们为小部件)。这些小部件基本上由 MyWidget.hMyWidget.m 文件以及 MyWidget.xib 文件组成,其中根元素是 UIView,MyWidget 类是 UIView 的文件所有者。在这个小部件的初始化中,我做了一个 loadNibNamed

然后在我的 View Controller 中执行 [[MyWidget alloc] init],将其作为子视图添加到 View 的 Controller 主视图中。到目前为止,这完美无缺。

我现在想知道,如何对故事板做同样的事情,因为我不能真正开始在某个地方拖入 UIView,我总是必须从 UIViewController 开始,我不想这样做。

如果无法使用 Storyboard 执行此操作,我是否可以简单地使用旧方法,将 Storyboard 用于我的主屏幕和转场,并使用单独的 .xib 文件来定义自定义视图?

您是否希望为您的视图控制器单独创建 xib,而不是在情节提要中?
你找到解决方案了吗?
@aryaxt:我正在使用 Storyboard 和 xib 的混合物。主屏幕和 xib 的情节提要,只有 UIView 作为复杂视图或小部件的根。所以并不是我最初的问题的真正答案(通过使用故事板),但基本上做了我以前做过的事情。
现在,只需使用容器视图,就这么简单.. stackoverflow.com/questions/23399061/…

C
Community

将小部件/视图放在单独的 .xib 文件中是可行的,特别是如果您可能想从多个视图控制器引用相同的视图。

但是,有时您确实希望在同一个故事板中看到其他视图/小部件,这是可能的。这是你如何做到的:

在 IB 中选择您的视图控制器(单击视图下方的黑条),然后将 UIView 从对象库中拖到黑条中:当视图在黑条中时,它会像 IB 中的任何其他视图一样被实例化,但只是直到您在代码中添加到您的视图层次结构中。如有必要,更改视图的类以匹配您自己的子类:您可以将其连接到您的视图控制器,就像您连接任何其他视图一样:添加的视图显示在您的文档大纲中,您也可以在那里连接操作和引用:

现在,仍然存在的问题是,无论您尝试单击或双击多少次,您都无法真正看到视图,这将破坏将其放在同一个故事板中的整个目的。幸运的是,我知道有两种解决方法。

第一个解决方法是将视图从黑条拖回视图控制器的视图,对其进行编辑,然后在完成后将其拖回黑条。这很麻烦但可靠。

另一种解决方法更挑剔,但我更喜欢它,因为它可以让我同时看到我的所有观点:

将 UITableView 从 Object Library 拖到新添加的视图中。然后将一个 UITableViewCell 拖到那个 UITableView 中。一旦你这样做了,你的视图就会神奇地从旁边弹出,但是你有一个你不想要的 UITableView。您可以将其调整为 0x0,也可以将其删除,并且您的 UIView 将(通常)仍然可见。有时,辅助视图会在 IB 中再次隐藏。如果您删除了 UITableView,您可以重复上述步骤,或者如果 UITableView 仍在层次结构中,您只需单击 UITableViewCell,视图将再次出现。

第二种方法适用于 UIViews 但不适用于 UIToolbars 并且对于 UIButtons 是不可能的,因此当您需要包含许多不同的子视图时,我发现的最干净的解决方案是将单个辅助 UIView 作为容器附加到您的视图控制器永远不会显示,将所有辅助视图放在那里,并使用 UITableViewCell 技巧使所有内容可见。我将我的虚拟 UITableView 调整为 0x0 以使其不可见。以下是所有内容的屏幕截图:

https://i.stack.imgur.com/ZgJPH.png


2013 年 3 月,我不需要这样做 - 您应该完全忽略黑条,并将您的视图直接拖放到主视图中,它工作正常(Xcode 4.5+)
是否可以在同一个 ViewController 上重用该自定义 uivew - 如果我前。需要两个自定义 uivews - 如果是这样?
Dang,我更喜欢只创建一个单独的 xib。当我必须在 6 个月内更新应用程序时,我可能不会记得这一切。
尽管这是一个很棒的答案,但我偶然发现了另一种更好的方法。将插座连接到实际视图组件时。如果您将鼠标悬停在此类内部视图的某个组件上 - 它会弹出以便于选择。然后你在故事板上看到它......
虽然这是一个令人难以置信的令人钦佩的历史答案,但实际上它现在已经完全过时了。 Apple 通过引入“容器视图”解决了整个问题,这现在是你在制作应用程序时所做的核心、基本的事情——一切都是“容器视图”。谢天谢地,现在很容易!
t
tipycalFlow

如果你只是想让你的视图控制器在其他地方(而不是在你的故事板中),那么有一个非常简单的方法来完成这个:

1) 像往常一样用他们各自的 xib 创建您的 CustomViewController(在我尝试过的代码中)。

2) 将 UIViewController(或 CustomViewController 的超类)添加到情节提要。

3) 将 CustomClass 设置为 CustomViewController 而不是 UIViewController,如下所示:

https://i.stack.imgur.com/s79p3.png

4) 最后,在您的 viewDidLoad 中,加载自定义 xib,您就完成了。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSBundle mainBundle] loadNibNamed:@"abcdController" owner:self options:nil];
    // Do any additional setup after loading the view from its nib.
}

感谢您非常详细的回答,但我实际上不是在寻找自定义视图控制器,而是在寻找添加到标准 UIViewController 的自定义视图(小部件)。所以视图控制器不是问题,但我想知道创建自定义小部件的最佳方法是什么。要么 A)像以前一样使用 .xib 文件,要么 B)我不知道的其他一些方法 :-)
嗯...我想我得到了你想要的。基本上你想用同一个控制器处理多个视图,对吧?在那种情况下,我想不出除了 loadNibNamed 之外的其他方法...... XO
这为我解决了这个问题:stackoverflow.com/questions/11047991/… 但是,我使用 loadView 而不是 viewDidLoad...
再说一遍,这一切(谢天谢地!)已经完全过时了,因为容器视图在这里。只需单击一个容器视图,一切就完成了
v
vijay_hrd

我认为你可以做这样的事情来从情节提要中获取特定视图控制器的实例并在其上使用视图。

ex:
MyViewController* myViewController = [[UIStoryboard storyboardWithName:@"Main"  bundle:nil] instantiateViewControllerWithIdentifier:@"myViewController"];
UIView* view = myViewController.view; //Get the view from your StoryBoard.

希望这可以帮助

谢谢维杰