【问题标题】:iOS using the same xib for multiple ViewControllersiOS 对多个 ViewController 使用相同的 xib
【发布时间】:2015-01-23 04:00:19
【问题描述】:

我正在创建一个应用程序并开始遇到一个问题,即我的应用程序的大小变得非常大,我正在寻找可以减小大小的方法。我有超过 50 个 xib,所以我认为这是我可以改进的领域之一。我有很多 xib,它们都与不同的 View Controller eacbh 匹配,其中一些非常相似。

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

我认为继承是最好的方法。创建我所有其他 ViewController 扩展的“SuperViewController”。 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;

所有这些 IBOutlets 都在我的 xib 文件中,并且在我的所有 ViewController 中。每个 ViewController 只是做的事情略有不同。

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

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

【问题讨论】:

  • 创建视图控制器不要为此设置文件所有者...为所有子视图添加标签在viewDidLoad中添加xib文件并使用其标签访问xib文件子视图...
  • 你是说实用地加载 nib 文件?

标签: ios inheritance uiviewcontroller xib


【解决方案1】:

我会将这些出口留在超类的 .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 文件的文件所有者设为 myViewControllerSuperclass,对吗?然后,当我设置了诸如连接到 myViewControllerSuperclass 的单击操作之类的操作时,我将如何覆盖它?
  • 1.是的 2. 假设 self.currentButton 连接到 -(IBAction )buttonAction:sender;... 那么您的子类可以覆盖 buttonAction: 并做任何它想做的(新事物)......
  • 当我这样做时,我的子类最终会出现一个空白屏幕。我重写了initWithNibName并传入了nil。如何让子类获取nib?
  • 为什么为 nibName 传入 nil?如果您完全覆盖它,那么请执行 nibNameOrNil = @"mySuperclassNibFile"; [super initWithNibName:nibNameOrNil ....] 如果你这样做了,那么所有的子类都会使用这个 nib..
  • 我的意思是参数以 nil 的形式进入该方法,但我刚刚意识到它总是以 nil 的形式出现在我所有工作的 ViewController 中。我所缺少的实际上是在该方法中传递 mySuperClassNibFile 名称并将其传递给 super。现在工作。谢谢!
【解决方案2】:

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

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

【讨论】:

  • 我确实有一些媒体,但数量很少。不过,真的,我有这么多的 xib 文件和视图控制器,尽管大小不一,但管理起来太难了。必须有更好的方法来进行重用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多