在故事板中,如何制作用于多個控制器的自定義單元?我正在嘗試在我正在使用的應用程序中使用故事板。在應用程序中有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?,F在我們所需要的只是對執行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 關注
- 505 瀏覽
添加回答
舉報
0/150
提交
取消