如何使用NIB文件推送一个UIViewController

4
我是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

基本上我不想通过编程来创建任何UI对象,我需要一个.xib文件来创建UI。

谢谢

(iOS 6,不使用storyboards)


你在哪里创建实际的视图控制器?在推送之前,你需要先进行alloc init操作。 - Fran Sevillano
如果你正在使用iOS 6,为什么要使用xib而不是storyboard呢?除非你在处理遗留代码,否则我看不出使用xib的任何理由。 - rdelmar
2个回答

13

通过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),现在我想知道是否有一种方法可以打开一个视图控制器而不是一个视图。我想使用分割视图控制器。 - Symphonicmind

0
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    ViewControllerToBePushed *viewController = [[ViewControllerToBePushed alloc] initWithNibName:@"ViewControllerToBePushed" bundle:nil];

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

使用上述方法,在选择特定行时推送到视图控制器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接