如何以编程方式设置 UITableViewController 自定义类?

Posted

技术标签:

【中文标题】如何以编程方式设置 UITableViewController 自定义类?【英文标题】:How to set UITableViewController custom class programmatically? 【发布时间】:2013-08-26 23:53:30 【问题描述】:

这是我的故事板:

UITableViewController 有一个通用的 UITableCell (MMSwitchTableCell),它有一个图像、一个标签和一个开关。

这个想法是能够创建不同的 UITableViewControllers 来呈现具有相同布局的不同数据,即具有相同的单元格对象和相同的行为。例如,一次 UITableView 有一个可以帮助您选择水果的单元格列表,第二次 UITable 可以帮助您选择家具。 这两个 UITablesViewController 之间没有任何关系(没有继承或聚合),它们是不同 viewController 中的不同实例,我只想重用设计的控件和 UITableCell 代码。

所以我的代码有一个 UIViewController,我在其中声明了一个属性:

@property (strong, nonatomic) MMGoSeePopoverTableViewController* goSeePopoverTableViewController;

懒加载它:

-(MMGoSeePopoverTableViewController*) goSeePopoverTableViewController

    if(_goSeePopoverTableViewController == nil)
    
        _goSeePopoverTableViewController =(MMGoSeePopoverTableViewController*)
        [self.storyboard instantiateViewControllerWithIdentifier:@"switchPopover"];
    

    return _goSeePopoverTableViewController;

以及我在其中声明属性的第二个 UIViewController:

 @property (strong, nonatomic) MMLayersPopoverTableViewController* layersPopoverTableViewController;

懒加载它:

-(MMLayersPopoverTableViewController*) layersPopoverTableViewController

    if(_layersPopoverTableViewController == nil)
    
        _layersPopoverTableViewController =(MMLayersPopoverTableViewController*)
        [self.storyboard instantiateViewControllerWithIdentifier:@"switchPopover"];
    

    return _layersPopoverTableViewController;

在情节提要中,我已将自定义类设置为 MMLayersPopoverTableViewController,但我希望将其留空并以某种方式在代码中进行设置。我想我应该在惰性加载器中执行此操作,但我不知道该怎么做。

编辑

建议的“这个问题在这里可能已经有了答案:”与我所问的不同。我已经修改了帖子以更好地解释我的问题。

【问题讨论】:

您提出这个要求的目的是什么?一个 View 应该绑定到一个 ViewController。 @0x7fffffff 谢谢你的链接,不幸的是你不明白我在问什么,所以我编辑了这个问题,希望现在它已经清楚了,你将能够提供帮助 【参考方案1】:

这个想法是能够创建不同的 UITableViewControllers 以相同的布局呈现不同的数据,即使用相同的单元格 对象和相同的行为。

这听起来像是您应该使用 .xib 文件而不是故事板的情况。与 .xib 文件相比,故事板的优势在于您可以根据视图和相应的视图控制器查看应用程序的结构。但是,在您的情况下,您正尝试重用具有不同视图控制器的相同视图。将您的表放入视图控制器拥有的 .xib 文件中,您可以使用您决定实例化的任何视图控制器加载相同的表、单元格等。

在您的 .xib 文件中,将 File's Owner 代理的类型设置为所有视图控制器类的某个公共超类,其中包含所有必要的功能。例如,如果您的所有视图控制器都派生自UITableViewController,并且您不需要任何特殊的插座,请将类型设置为UITableViewController,并将表连接到代理的tableView 插座。如果您的视图控制器有其他常见行为,请将所有这些放在 UITableViewController 的子类中,将其用作代理的类型,并从该类派生其他视图控制器。

完成所有这些后,您可以使用-initWithNibName:bundle: 方法来初始化您的任何视图控制器并加载相同的视图:

// in one place...
MMGoSeePopoverTableViewController *goSeeVC = [[MMGoSeePopoverTableViewController alloc]
                                              initWithNibName:@"CommonTableView.xib" bundle:nil"];
// and in some other place...
MMLayersPopoverTableViewController *layersVC = [[MMLayersPopoverTableViewController alloc]
                                              initWithNibName:@"CommonTableView.xib" bundle:nil"];

【讨论】:

您能否详细说明如何将表连接到代理的 tableView 插座?你可以为此放置一些代码吗?谢谢! 只需从表格中按住 control 并拖动到 IB 中的 Files Owner 图标,就像连接任何其他插座一样。

以上是关于如何以编程方式设置 UITableViewController 自定义类?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式设置scrollview高度

如何以编程方式设置图像源

如何以编程方式设置 windowDrawsSystemBarBackgrounds?

Android:如何以编程方式设置 LinearLayout 边距

如何以编程方式设置 UIView 的自动调整大小掩码?

如何在 Objective C 中以编程方式设置集合视图?