Ios 可以在基本表视图类中注册所有表视图单元格吗?

Ios 可以在基本表视图类中注册所有表视图单元格吗?,ios,objective-c,swift,Ios,Objective C,Swift,我认为这不是一个固执己见的问题,而是一个要知道这在iOS中是否是一个好做法的问题 我目前正在项目中的每个控制器中注册自定义tableviewcell // MARK: Lifecycle override func viewDidLoad() { super.viewDidLoad() self.tableView.tableHeaderView = UIView() self.tableView.tableFooterView = UIView() sel

我认为这不是一个固执己见的问题,而是一个要知道这在iOS中是否是一个好做法的问题

我目前正在项目中的每个
控制器中注册自定义
tableviewcell

// MARK: Lifecycle

override func viewDidLoad() {
    super.viewDidLoad()

    self.tableView.tableHeaderView = UIView()
    self.tableView.tableFooterView = UIView()

    self.tableView.register(R.nib.customCellXX)
    self.tableView.register(R.nib.customCellYY)
    // and so on...

    self.tableView.estimatedRowHeight = 150.0
    self.tableView.rowHeight = UITableViewAutomaticDimension
}
我只是想知道我是否可以创建一个
tableView
的子类,在那里注册我所有的自定义
tableViewCells
,并将
tableView
+
tableHeaderView
+
tableFooterView
的自动高度。在这种情况下,我减少了
控制器中的代码行,避免了冗余


编辑:如果这是一个好的做法,我可以在子类
BaseTableView
中将自定义单元格的注册放在哪里?

只要调用
super.viewDidLoad()
,您就可以在子VC的重写
viewDidLoad
方法中注册自定义单元格。也就是说,在iOS中,将VCs子类化通常是一种糟糕的做法

如果使用界面生成器
IBOutlets
会从
情节提要
连接到
。swift
文件都有识别值,并且可能导致
nil
引用崩溃,并导致构建错误

如果您试图在多个
VCs
中使用相同的
IBOutlets
,如果您试图将任何
UI
元素连接到父VC,则必须这样做

如果您希望您的所有VCs都有一些共享签名(即相同的方法或属性),请创建一个自定义协议。如果您希望他们都能访问Interface Builder中相同的
UI
元素,请学习使用
情节提要


您可以在故事板中创建VC,并在代码中轻松实例化它。

您可以在子VC重写的
viewDidLoad
方法中调用
super.viewDidLoad()
。也就是说,在iOS中,将VCs子类化通常是一种糟糕的做法

如果使用界面生成器
IBOutlets
会从
情节提要
连接到
。swift
文件都有识别值,并且可能导致
nil
引用崩溃,并导致构建错误

如果您试图在多个
VCs
中使用相同的
IBOutlets
,如果您试图将任何
UI
元素连接到父VC,则必须这样做

如果您希望您的所有VCs都有一些共享签名(即相同的方法或属性),请创建一个自定义协议。如果您希望他们都能访问Interface Builder中相同的
UI
元素,请学习使用
情节提要


您可以在故事板中创建VC,并在代码中轻松实例化它。

可以通过以下方式完成:

- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style {

      self = [super initWithFrame:frame style:style];

      if (self) {
         [self registerClass:[MyTableViewCell class] forCellReuseIdentifier:@"reUseIdentifier"];
      }

      return self;
}

稍后,您可以将其子类化为UITableView,甚至可以在不同的控制器中使用。

可以通过以下方式完成:

- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style {

      self = [super initWithFrame:frame style:style];

      if (self) {
         [self registerClass:[MyTableViewCell class] forCellReuseIdentifier:@"reUseIdentifier"];
      }

      return self;
}

稍后,您可以将其子类化为UITableView,甚至可以在不同的控制器中使用。

这可以通过这种方式完成。您可以在该自定义表视图中注册所有单元格。如果您需要一个示例,请告诉我。是的,请参阅编辑后的问题,在我的子类
BaseTableView
中,自定义单元格的注册应该放在哪里?在
didMoveToWindow()
中,这可以通过这种方式完成。您可以在该自定义表视图中注册所有单元格。如果您需要一个示例,请告诉我。是的,请参阅编辑后的问题,在我的子类
BaseTableView
中,自定义单元格的注册应该放在哪里?在
didMoveToWindow()
?哇,我不知道在iOS中使用
BaseViewController
是一种糟糕的做法。我有这样一个类来设置
viewController
的默认配置,比如删除导航标题,将状态栏设置为默认,等等。。。我当然知道如何使用故事板。在
UITableView
中没有
viewDidLoad()
。我已经看过好几次了,它有很多用途,但是Swift中重用行为的一般规则是:如果你能用协议来做,就用协议来做。重用的UI元素并不能很好地用于继承。如果您想重用同一个自定义UIView,可以使用.xib和/或自定义类,并将其添加到多个VCs中,而不会带来太多麻烦或内存使用过多。另外,很抱歉,这一点不明确。在Swift中何时使用继承是一个复杂的问题。如果你想要一个相对复杂的项目的例子,它有共享的行为但很少继承,我可以提供一个链接到我正在为朋友构建的应用程序。好的,现在,我在一个故事板中有多个
viewControllers
。一些
viewcontroller
中包含
tableview
。分配给这些
表视图
my
BaseTableView
?当然,我很高兴能证实这一点。@dylanthelion我认为这有点不正确。您几乎总是将ViewController子类化,甚至Xcode模板也建议这样做。只要尝试添加一个新的viewcontroller,它总是类似于
类MyViewController:UIViewController
。因此,据我所知,子类化(视图控制器)在Cocoa(Touch)中非常常见。你对协议所做的是与视图的交互,至少是那些稍微复杂一点的视图。哇,我不知道在iOS中使用
BaseViewController
是一种糟糕的做法。我有这样一个类来设置
viewController
的默认配置,比如删除导航标题,将状态栏设置为默认,等等。。。我当然知道如何使用故事板。而且在
UITableView
中没有
viewDidLoad()