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

时间:2013-08-26 23:53:30

标签: objective-c uitableview

这是我的故事板:

enter image description here

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

这个想法是能够创建不同的UITableViewControllers,它们以相同的布局呈现不同的数据,即具有相同的单元对象和相同的行为。例如,一次UITableView有一个帮助你选择水果的单元格列表,第二次UITable可以帮助你选择家具。 两个UITablesViewController之间没有任何关系(没有继承或聚合),它们是不同viewControllers中的不同实例,我只想重用设计的控件和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,而我希望将其留空并以某种方式将其设置在代码中。我想我应该在懒惰的加载器中做到这一点,但我无法弄清楚如何。

修改

建议“这个问题可能已在这里得到答案:”与我提出的问题不一样。我已修改帖子以更好地解释我的问题。

1 个答案:

答案 0 :(得分:0)

  

这个想法是能够创建不同的UITableViewControllers   呈现具有相同布局的不同数据,即具有相同的单元格   对象&同样的行为。

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

在.xib文件中,将文件所有者代理的类型设置为包含所有必要功能的所有视图控制器类的某个公共超类。例如,如果所有视图控制器都派生自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"];