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

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

我正在尝试在我正在使用的应用程序中使用故事板。在应用程序中有ListsUsers,每个都包含其他列表(列表成员,用户拥有的列表)。所以,相应地,我有ListCellUserCell课。目标是让它们在整个应用程序中可重复使用(即,在我的任何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的流,并在视觉上而不是在代码中定义单元格布局。到目前为止,我无法看到如何获得这两者。


白衣染霜花
浏览 481回答 3
3回答

皈依舞

尽管BJ Homer给出了很好的答案,但我觉得我有一个解决方案。就我的测试而言,它有效。概念:为xib单元创建自定义类。在那里,您可以等待触摸事件并以编程方式执行segue。现在我们所需要的只是对执行Segue的控制器的引用。我的解决方案是将其设置为tableView:cellForRowAtIndexPath:。例我有一个DetailedTaskCell.xib表格单元格,我想在多个表视图中使用它:TaskGuessTableCell该单元格有一个自定义类:这就是魔术发生的地方。//&nbsp;TaskGuessTableCell.h#import&nbsp;<Foundation/Foundation.h>@interface&nbsp;TaskGuessTableCell&nbsp;:&nbsp;UITableViewCell@property&nbsp;(nonatomic,&nbsp;weak)&nbsp;UIViewController&nbsp;*controller;@end//&nbsp;TashGuessTableCell.m#import&nbsp;"TaskGuessTableCell.h"@implementation&nbsp;TaskGuessTableCell@synthesize&nbsp;controller;-&nbsp;(void)touchesEnded:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)event{ &nbsp;&nbsp;&nbsp;&nbsp;NSIndexPath&nbsp;*path&nbsp;=&nbsp;[controller.tableView&nbsp;indexPathForCell:self]; &nbsp;&nbsp;&nbsp;&nbsp;[controller.tableView&nbsp;selectRowAtIndexPath:path&nbsp;animated:NO&nbsp;scrollPosition:UITableViewScrollPositionNone]; &nbsp;&nbsp;&nbsp;&nbsp;[controller&nbsp;performSegueWithIdentifier:@"FinishedTask"&nbsp;sender:controller]; &nbsp;&nbsp;&nbsp;&nbsp;[super&nbsp;touchesEnded:touches&nbsp;withEvent:event];}@end我有多个Segues,但它们都有相同的名字:"FinishedTask"。如果你需要在这里灵活,我建议添加另一个属性。ViewController看起来像这样://&nbsp;LogbookViewController.m#import&nbsp;"LogbookViewController.h"#import&nbsp;"TaskGuessTableCell.h"@implementation&nbsp;LogbookViewController-&nbsp;(void)viewDidLoad{ &nbsp;&nbsp;&nbsp;&nbsp;[super&nbsp;viewDidLoad] &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;register&nbsp;custom&nbsp;nib &nbsp;&nbsp;&nbsp;&nbsp;[self.tableView&nbsp;registerNib:[UINib&nbsp;nibWithNibName:@"DetailedTaskCell"&nbsp;bundle:[NSBundle&nbsp;mainBundle]]&nbsp;forCellReuseIdentifier:@"DetailedTaskCell"];}-&nbsp;(UITableViewCell&nbsp;*)tableView:(UITableView&nbsp;*)tableView&nbsp;cellForRowAtIndexPath:(NSIndexPath&nbsp;*)indexPath{ &nbsp;&nbsp;&nbsp;&nbsp;TaskGuessTableCell&nbsp;*cell; &nbsp;&nbsp;&nbsp;&nbsp;cell&nbsp;=&nbsp;[tableView&nbsp;dequeueReusableCellWithIdentifier:@"DetailedTaskCell"]; &nbsp;&nbsp;&nbsp;&nbsp;cell.controller&nbsp;=&nbsp;self;&nbsp;//&nbsp;<--&nbsp;the&nbsp;line&nbsp;that&nbsp;matters &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;if&nbsp;you&nbsp;added&nbsp;the&nbsp;seque&nbsp;property&nbsp;to&nbsp;the&nbsp;cell&nbsp;class,&nbsp;set&nbsp;that&nbsp;one&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;cell.segue&nbsp;=&nbsp;@"TheSegueYouNeedToTrigger"; &nbsp;&nbsp;&nbsp;&nbsp;cell.taskTitle.text&nbsp;&nbsp;=&nbsp;[entry&nbsp;title]; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;set&nbsp;other&nbsp;outlet&nbsp;values&nbsp;etc.&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;cell;}-&nbsp;(void)prepareForSegue:(UIStoryboardSegue&nbsp;*)segue&nbsp;sender:(id)sender{ &nbsp;&nbsp;&nbsp;&nbsp;if([[segue&nbsp;identifier]&nbsp;isEqualToString:@"FinishedTask"]) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;do&nbsp;what&nbsp;you&nbsp;have&nbsp;to&nbsp;do,&nbsp;as&nbsp;usual &nbsp;&nbsp;&nbsp;&nbsp;}}@end可能有更优雅的方法来实现相同但是 - 它的工作原理!:)
打开App,查看更多内容
随时随地看视频慕课网APP