在故事板中,如何制作用于多个控制器的自定义单元?我正在尝试在我正在使用的应用程序中使用故事板。在应用程序中有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
可能有更优雅的方法来实现相同但是 - 它的工作原理!:)
- 3 回答
- 0 关注
- 480 浏览
添加回答
举报
0/150
提交
取消