iOS对多个ViewController使用相同的xib

iOS对多个ViewController使用相同的xib,ios,inheritance,uiviewcontroller,xib,Ios,Inheritance,Uiviewcontroller,Xib,我正在创建一个应用程序,开始遇到一个问题,我的应用程序的大小越来越大,我正在寻找减少大小的方法。我有50多个XIB,所以我认为这是我可以改进的领域之一。我有很多XIB都匹配到不同的视图控制器eacbh,其中一些非常相似 我希望能够使用这些类似的ViewController,并为所有这些控件重用一个xib,以减少大小 我认为继承是最好的方法。创建一个“SuperViewController”,我的所有其他ViewController都会扩展它。SuperViewController将连接到xib,

我正在创建一个应用程序,开始遇到一个问题,我的应用程序的大小越来越大,我正在寻找减少大小的方法。我有50多个XIB,所以我认为这是我可以改进的领域之一。我有很多XIB都匹配到不同的视图控制器eacbh,其中一些非常相似

我希望能够使用这些类似的ViewController,并为所有这些控件重用一个xib,以减少大小

我认为继承是最好的方法。创建一个“SuperViewController”,我的所有其他ViewController都会扩展它。SuperViewController将连接到xib,然后我可以重用我需要的东西

以下是我在SuperViewController中的内容。m:

 @property (weak, nonatomic) IBOutlet UITableView *tableView;
 @property (weak, nonatomic) IBOutlet UIView *emptyView;
 @property (weak, nonatomic) IBOutlet UIButton *currentButton;
 @property (weak, nonatomic) IBOutlet UIButton *quitWalkButton;
所有这些IBoutlet都在我的xib文件中,并且都在我的所有ViewController中。每个ViewController只是对这些控件执行稍微不同的操作

问题是,因为它们在我的.m文件中,它们本质上是私有的,我不能从子类访问它们。我可以将它们放在.h文件中并能够访问它们,但我不希望它们公开,我希望它们受到“保护”。此外,我不确定像单击这样的操作将如何工作,因为它们总是在.m文件中


我开始认为继承不是在多个视图控制器中重用xib文件的方法,但我不确定什么是可以接受的方法。任何一种方式的建议都是值得赞赏的。

在我见过的应用程序中,空间的最大消费者是媒体,而不是XIB数据。大图像、视频、音频等会很快占用空间


如果某个东西实际占用了XIB中的空间,那么通过查看文件中的XML而不是查看Xcode的可视化编辑器来查找它可能会更容易。您可能会发现大量二进制数据。

我会将这些输出放在超类的.m文件顶部,并在单独的头/扩展中为每个输出放置第二个访问器

   //myViewControllerSuperclass+privateOutlets
     # import "myViewControllerSuperclass"
     @interface myViewControllerSuperclass(privateOutlets)

    //this header to be imported to your subclasses
     @property (readonly) UITableView *tableView_;
     @property (readonly) UIView *emptyView_;
     @property (readonly) UIButton *currentButton_;
     @property (readonly) UIButton *quitWalkButton_;
    //note trailing underscore..



//myViewControllerSuperclass.m
# import "myViewControllerSuperclass+privateOutlets"
@implementation myViewControllerSuperclass

#pragma mark - privateOutlets
-(UITableView *)tableView_{
return self.tableView;
}
-(UIView *)emptyView_{
return self.emptyView;
}
-(UIButton *)currentButton_{
return self.currentButton;
}
-(UIButton *)quitWalkButton_{
return self.quitWalkButton;
}
//these 'getters' just point to the existing outlets..

我有一些媒体,但数量很少。但实际上,我有太多的xib文件和视图控制器,无论大小,都很难管理。必须有一种更好的方法来进行重用。因此,通过这种方法,我可以使xib文件的文件所有者成为myViewControllerSuperclass,对吗?然后,当我设置了像连接到myViewControllerSuperclass的单击操作这样的操作时,我如何能够覆盖它呢?1。是的。假设self.currentButton连接到-(iAction)buttonAction:sender;。。。你的子类可以覆盖buttonAction:并且做它想做的任何事情(新的事情)……当我这样做的时候,我的子类会有一个空白屏幕。我用nibName重写init,并传入nil。如何使子类获得nib?为什么要将nil传递给nibName?如果您完全覆盖了它,那么执行nibNameOrNil=@“mySuperclassNibFile”;[super initWithNibName:nibNameOrNil….]如果这样做,那么所有子类都将始终使用此nib..我的意思是该方法中的参数为nil,但我刚刚意识到,对于所有工作的ViewController,它总是以nil的形式出现。但我缺少的是在该方法中传入mySuperClassNibFile名称并将其传递给super。现在工作。谢谢创建视图控制器不要为此设置文件所有者。。。将所有子视图的标签添加到viewDidLoad中的xib文件,并使用其标签访问xib文件子视图……那么您是说实际加载nib文件吗?