【问题标题】:How to Push an UIViewController with NIB file如何使用 NIB 文件推送 UIViewController
【发布时间】:2013-04-10 21:49:15
【问题描述】:

我是 iOS 开发的新手,我很头疼,不理解一些可能很容易的东西。 基本上我使用 UITableViewController 去另一个 UITableViewController,但是我需要从第二个 UITableViewController 去一个 UIViewController。我希望这个 UIViewController 有一个 .xib 文件让我制作一个快速的 UI,但我似乎找不到从第二个 UITableViewController 推送到这个 UIViewController 的方法。 我设法以编程方式显示标签,但不是来自 .xib 的 UI。

这是与程序化标签一起使用的代码:

- (void)tableView:(UITableView *)tableView
accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    self.detailController.title = @"Disclosure Button Pressed";
    NSString *selectedMovie = self.movies[indexPath.row];
    NSString *detailMessage = [[NSString alloc]
                                initWithFormat:@"This is details for %@.",
                                selectedMovie];
    self.detailController.message = detailMessage;
    self.detailController.title = selectedMovie;
    [self.navigationController pushViewController:self.detailController
                                        animated:YES];
}

这是 UIViewController 的 .m,用于以编程方式显示 UILabel。

@implementation BIDDisclosureDetailViewController
- (UILabel *)label;
{
    return (id)self.view;
}
- (void)loadView;
{
    UILabel *label = [[UILabel alloc] init];
    label.numberOfLines = 0;
    label.textAlignment = NSTextAlignmentCenter;
    self.view = label;
}
- (void)viewWillAppear:(BOOL)animated;
{
    [super viewWillAppear:animated];
    self.label.text = self.message;
}
@end

基本上我不想以编程方式创建任何 UIObject,我需要一个 .xib 来创建 UI。

谢谢

(iOS 6,不使用情节提要)

【问题讨论】:

  • 你在哪里创建实际的视图控制器?你需要在推送之前分配初始化它。
  • 如果您使用的是 iOS 6,为什么要使用 xibs 而不是情节提要?除非您正在处理遗留代码,否则我认为没有理由再使用 xibs。

标签: ios uiviewcontroller push nib


【解决方案1】:

从 xib 加载 UIViewController 很容易。当您的 tableview 委托发送 didSelectRowAtIndexPath: 消息时,您可以加载 xib 并按如下方式显示视图控制器:

BIDDisclosureDetailViewController *controller = [[BIDDisclosureDetailViewController alloc] initWithNibName:@"BIDDisclosureDetailView" bundle:nil];

[self.navigationController pushViewController:controller animated:YES];

注意事项:

  1. 您无需从 xib 加载视图控制器,仅加载视图。这就是为什么在上面的代码中我使用initWithNibName:bundle: 创建视图控制器的新实例的原因
  2. 为了让所有这些都在 IB 中正确连接,您将 xib 中的“文件所有者”设置为正确的视图控制器类型 (BIDDisclosureDetailViewController)。
  3. 请务必删除其中的loadView 代码,它会在尝试使用 xib 时搞砸。

旁注!您不应该在这样的方法签名末尾使用分号:

- (void)viewWillAppear:(BOOL)animated;

它被认为是错误的形式。

希望这会有所帮助!

【讨论】:

  • 太好了,非常感谢,(我错过了 initWithNibName)现在我想知道是否有办法打开视图控制器而不是视图。我想使用拆分视图控制器。
【解决方案2】:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    ViewControllerToBePushed *viewController = [[ViewControllerToBePushed alloc] initWithNibName:@"ViewControllerToBePushed" bundle:nil];

[self.navigationController pushViewController:viewController animated:YES];
}

使用上述方法在选择特定行时按下视图控制器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2012-02-08
    • 2013-03-27
    • 2018-01-20
    • 1970-01-01
    相关资源
    最近更新 更多