如何在Xcode中使用相同的nib文件创建多个窗口

4
我有一个iPhone应用程序,使用表视图作为界面。每次用户点击其中一个表格单元时,我想向用户显示另一个窗口。但是,我将推入导航控制器的窗口的用户界面非常相似。因此,我决定制作一个“通用nib文件”,用于所有这个通用nib文件的文件所有者的子类。
然而,我困惑的是(也不起作用的是),我似乎无法自定义这个通用nib文件。我在文件初始化时有以下代码:
在.h文件中:
#import <UIKit/UIKit.h>
#import "primeViewController.h"

@interface subclass1 : primeViewController { //subclassing from a generic view controller that owns a generic nib file

}

在 .m 文件中:
#import "subclass1.h"

@implementation subclass1

- (id) initWithLabelAndButton {
    if(self = [super initWithNibName:@"primeViewController" bundle:nil]) {
        self.label.text = @"Title of the first subclass";   

    }
    return self;
}

但是当我在表格视图中实例化该类时:

//somewhere in rootviewcontroller.m:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    switch (indexPath.row) {
        case 0:
        {
            checkPrime* checkPrimeViewController = [[checkPrime alloc] initWithLabelAndButton];
            [self.navigationController pushViewController:checkPrimeViewController animated:YES];
            [checkPrimeViewController release];
            break;
        }
        default:
            break;
    }
}

有人能告诉我我错在哪里吗?或者我是错误地认为xcode允许我在其子类中多次使用nib文件?我不知道为什么我不能这样做,但我想不出如何解决...


1
你实际上并没有说出哪里出了问题。 - Gary
多窗口是指什么?在 iOS 应用程序中只能有一个窗口。 - ipraba
我本意是想说我想使用一个XIB文件来创建多个类。这样,当我想要将另一个窗口推送到我的视图控制器时,我可以有一个模板XIB供我参考。 - Enrico Susatyo
3个回答

4

当Nib文件被加载时,它创建的视图控制器与.xib文件中完全相同的类(UIViewController、PrimeViewController或其他类)。

.nib文件中实际保存了什么内容呢?如果您将UIView和所有对应的对象存储在xib中,并且通过使用[[NSBundle mainBundle] loadNibNamed:@"YourNibFile" owner:class1ViewController options:nil]只加载它们,那么在nib中连接到相应的File Owner输出口的视图就能够成功加载。


啊..好的,所以我们实际上可以通过编程方式设置xib文件的所有者吗?另一个问题是,如果我们通过编程方式设置了所有者,并且所有者有IBOutlets,它们会被正确设置吗?(嗯,我想这意味着如果我们使用某个类进行实例化,我们必须确保该类具有所有的IBOutlets..我是对的吗?) - Enrico Susatyo
1
我的理解是,IBOutlets只是代码中的提示,用于帮助Interface Builder知道您要将什么视为outlet。它们的缺失并不会对您的代码造成任何伤害(缺少outlet本身会造成影响,但那是另一回事)。[http://www.cocoadev.com/index.pl?IBOutlet] - paulbailey
好的,那听起来还不错。不过我现在没有时间测试它。 - Enrico Susatyo

2

如果您将所有视图放在一个NIB中,则当应用程序启动时,它必须将整个NIB加载到内存中并构造所有控件的对象,这需要很长时间。

如果您将视图分别放在不同的NIB中,则您的应用程序会启动得更快,因为只有包含初始视图的NIB会被加载。然后,在视图更改时,您可以加载包含新视图的NIB。这会在第一次打开视图时遇到轻微卡顿。

如果您尝试优化内存使用,您可以在切换视图时卸载宝贵的视图。


0
我建议您子类化UITableViewController并在此处添加任何方法、实例变量和属性,以适用于不同的视图。创建您的nib文件,并将其引用到这些对象的实例。
然后,再次子类化您的子类以获得定制功能,例如:
GenericSubclassVC* checkPrimeViewController = [[SpecificSubclassVC alloc] initWithNibName:@"GenericNib" and Bundle:nil];
[self.navigationController pushViewController:checkPrimeViewController animated:YES];

你应该坚持重写指定的初始化方法。将任何自定义初始化代码放入awakeFromNib或viewDidLoad方法中,具体取决于它们是否需要修改UIView对象。
然而,正如其他人所提到的,这并不是非常高效或优雅的方式。如果所有的ViewControllers都是表视图控制器,并且有相同的数据模型来显示,则有其他方法可以实现代码重用,例如定义一个数据源对象。

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