单击选项卡时,选项卡栏控制器不显示 XIB UIViewController
Posted
技术标签:
【中文标题】单击选项卡时,选项卡栏控制器不显示 XIB UIViewController【英文标题】:Tab Bar Controller does not display XIB UIViewController when tab is clicked 【发布时间】:2015-05-03 07:37:37 【问题描述】:这里是场景
创建新项目选项卡式应用程序。添加新控制器 TestViewController 和 XIB 文件,在 XIB 文件中添加一个带有文本“TestViewControllerButton”的按钮。
如果我在 FirstViewController 中创建一个按钮,并添加一个动作到 TestViewController,XIB 文件中的按钮就会显示出来。
TestViewController* vc = [[TestViewController alloc] init];
[self presentViewController:vc animated:YES completion:nil];
问题是当我将 TestViewController 添加到选项卡控制器(索引 2,从 0 开始)时,它不显示 XIB(我的意思是,按钮不显示)。
这是我的步骤。我在 Tab Controller 中添加 UIViewController,然后在 Identity Inspector 中将类更改为 TestViewController。然后将 Tab Bar Item 添加到 TestViewController 并将其链接到 Tab Bar Controller,这样当最后一个选项卡被单击时,它就会链接到 TestViewController。但问题是,XIB中的按钮没有显示(我在TestViewController.xib中添加了按钮)。
是的,当然我可以在我的 TestViewController 中的 Main.storyboard 中直接添加按钮,但我的想法是我想在 TestViewController XIB 中管理 UI,而 main.storyboard 只是加载 TestViewController 图像中的视图。
好的,我添加一些截图以便理解。当我以编程方式运行时,此屏幕运行良好,在 UIViewController 中运行(上面的代码 - self presentViewController:vc animated:YES completion:nil)。
当我从 Tab 运行时
我认为的设置已经正确(因为它在UIViewController中运行良好)
已将文件所有者设置为 TestViewController
已经绑定了插座
谢谢!
【问题讨论】:
【参考方案1】:我认为您正在使用 Inferred 大小的 ViewController,在 Attribute Inspector 中将其更改为 iPhone 4 英寸(Simulated Metrics -> Size 并根据该大小设置按钮框架。
希望有帮助:)
【讨论】:
@Jef - 您可以下载示例代码并让我知道。链接 - github.com/ArpitLokwani/ALTabbedBarSample 不行。我的问题是,如何将视图控制器场景中的视图(有一个按钮 TestViewControllerButton)分离到单独的 XIB 中。不只是在现有的主故事板中放置一个按钮,我之前已经在我的问题中提到过。我认为您的解决方案与我的问题略有不同,因为在您的示例中也没有我提供的屏幕截图。【参考方案2】:当然它不会显示控件。看,你在这些地方使用了两个不同的视图控制器。在 xib 中,您实际上已经添加了按钮,因此当您的 testViewController
实例从 xib 创建时,它具有按钮及其关联的操作。但是,如果您在情节提要中添加viewController
并将其类设置为TestViewController
的类,您所做的只是将新view controller
的类类型设置为TestViewController
。但是您没有提供任何信息,故事板可以通过这些信息知道它必须从保存在其 XIB 中的图像中创建 testViewController
的新实例。所以它只是创建了一个 TestViewController
类型的新视图控制器,使用它在故事板内部的图像(其中没有按钮)。
因此,要从 xib 获取视图控制器,您必须在 TestViewController
实现中覆盖 initWithCoder:
方法并从 XIB 返回 viewController 的实例。比如:
- (instancetype)initWithCoder:(NSCoder *)aDecoder
return [self initWithNibName:nil bundle:nil];
【讨论】:
是的,实际上这已经差不多解决了,但还有两个问题: 1. 添加代码后图标选项卡丢失,如何恢复,请参阅punyaku.com/ios/noTabIcon.png。 2. TestViewController.viewDidLoad 方法中是否有加载XIB的功能? TestViewController 是从 UIViewController 扩展而来的。如果 UI 是从 UITableViewController 扩展的,要将 XIB 注册到 UITableViewCell,我可以在 viewDidLoad 方法中使用 [self.tableView registerNib...]。有没有相同的功能可以做到这一点?在这些答案之后将投票并标记为答案。谢谢!以上是关于单击选项卡时,选项卡栏控制器不显示 XIB UIViewController的主要内容,如果未能解决你的问题,请参考以下文章