亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在故事板中,如何制作用于多個控制器的自定義單元?

在故事板中,如何制作用于多個控制器的自定義單元?

白衣染霜花 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?,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

可能有更優雅的方法來實現相同但是 - 它的工作原理!:)


查看完整回答
反對 回復 2019-08-14
  • 3 回答
  • 0 關注
  • 505 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號