为了账号安全,请及时绑定邮箱和手机立即绑定

在故事板中,如何制作用于多个控制器的自定义单元?

在故事板中,如何制作用于多个控制器的自定义单元?

白衣染霜花 2019-08-14 17:26:40
在故事板中,如何制作用于多个控制器的自定义单元?我正在尝试在我正在使用的应用程序中使用故事板。在应用程序中有Lists和Users,每个都包含其他列表(列表成员,用户拥有的列表)。所以,相应地,我有ListCell和UserCell课。目标是让它们在整个应用程序中可重复使用(即,在我的任何tableview控制器中)。这就是我遇到问题的地方。如何在故事板中创建可在任何视图控制器中重复使用的自定义tableview单元格?以下是我迄今为止尝试过的具体内容。在Controller#1中,添加了一个原型单元格,将类设置为我的UITableViewCell子类,设置重用ID,添加标签并将它们连接到类的出口。在Controller#2中,添加了一个空的原型单元格,将其设置为同一个类并重复使用id。当它运行时,当控制器#2中显示单元格时,标签永远不会出现。在Controller#1中正常工作。在不同的NIB中设计每种细胞类型,并连接到适当的细胞类。在storyboard中,添加了一个空的原型单元格并设置其类并重用id来引用我的单元类。在控制器的viewDidLoad方法中,为重用ID注册了那些NIB文件。如图所示,两个控制器中的单元格都像原型一样空。将两个控制器中的原型保持为空并设置类并将id重用于我的单元类。完全用代码构建单元格的UI。细胞在所有控制器中都能完美运在第二种情况下,我怀疑原型总是覆盖NIB,如果我杀死原型单元,注册我的NIB用于重用ID将起作用。但后来我无法设置从单元格到其他框架的segue,这实际上是使用故事板的重点。在一天结束时,我想要两件事:在故事板中连接基于tableview的流,并在视觉上而不是在代码中定义单元格布局。到目前为止,我无法看到如何获得这两者。
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

尽管BJ Homer给出了很好的答案,但我觉得我有一个解决方案。就我的测试而言,它有效。

概念:为xib单元创建自定义类。在那里,您可以等待触摸事件并以编程方式执行segue。现在我们所需要的只是对执行Segue的控制器的引用。我的解决方案是将其设置为tableView:cellForRowAtIndexPath:

我有一个DetailedTaskCell.xib表格单元格,我想在多个表视图中使用它:

TaskGuessTableCell该单元格有一个自定义类:

这就是魔术发生的地方。

// TaskGuessTableCell.h#import <Foundation/Foundation.h>@interface TaskGuessTableCell : UITableViewCell@property (nonatomic, weak) UIViewController *controller;@end// TashGuessTableCell.m#import "TaskGuessTableCell.h"@implementation TaskGuessTableCell@synthesize controller;- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    NSIndexPath *path = [controller.tableView indexPathForCell:self];
    [controller.tableView selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionNone];
    [controller performSegueWithIdentifier:@"FinishedTask" sender:controller];
    [super touchesEnded:touches withEvent:event];}@end

我有多个Segues,但它们都有相同的名字:"FinishedTask"。如果你需要在这里灵活,我建议添加另一个属性。

ViewController看起来像这样:

// LogbookViewController.m#import "LogbookViewController.h"#import "TaskGuessTableCell.h"@implementation LogbookViewController- (void)viewDidLoad{
    [super viewDidLoad]

    // register custom nib
    [self.tableView registerNib:[UINib nibWithNibName:@"DetailedTaskCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"DetailedTaskCell"];}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    TaskGuessTableCell *cell;

    cell = [tableView dequeueReusableCellWithIdentifier:@"DetailedTaskCell"];
    cell.controller = self; // <-- the line that matters
    // if you added the seque property to the cell class, set that one here
    // cell.segue = @"TheSegueYouNeedToTrigger";
    cell.taskTitle.text  = [entry title];
    // set other outlet values etc. ...

    return cell;}- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([[segue identifier] isEqualToString:@"FinishedTask"])
    {
        // do what you have to do, as usual
    }}@end

可能有更优雅的方法来实现相同但是 - 它的工作原理!:)


查看完整回答
反对 回复 2019-08-14
  • 3 回答
  • 0 关注
  • 480 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信