簡體   English   中英

iOS 5 - 從一個TableViewController調用另一個TableViewController

[英]iOS 5 - Segue from one TableViewController to another TableViewController

我正在嘗試從一個TableViewController中選擇一個詳細信息公開按鈕(或一行)並轉到另一個TableViewController,而不從第一個TableViewController傳遞任何數據到第二個TableViewController。 所以幾乎第一個TableViewController充當一個表,它將導航到不同的TableViewControllers,具體取決於所選的詳細公開按鈕(或行)。

到目前為止,我執行此操作的代碼如下所示:

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {


    NSUInteger rowNumber = [indexPath row];   
    NSString *categoryCode = [self.categoryCodes objectAtIndex:rowNumber];

    self.categoryData = [self.commuterDict objectForKey:categoryCode];

    [self performSegueWithIdentifier:@"ShowPlaces" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([[segue identifier] isEqualToString:@"ShowPlaces"]) {

        PlacesViewController *placesViewController = [segue destinationViewController];

        // --> I believe I'm missing something here to access a specific row? <--



    }
}

我希望有一個人可以幫助我!

您從tableView中的indexPath獲取特定行:accessoryButtonTappedForRowWithIndexPath:function。 具體來說,被挖掘的行是indexPath.row。 (如果你的表有多個部分,那么你也可以讀取indexPath的部分,但聽起來你只是使用一個簡單的表。)

您可以將當前行存儲在變量中,然后在prepareForSegue:sender中讀取它以選擇去哪里。

UIViewController的-prepareForSegue:sender:的文檔說:

因為segues可以從多個源觸發,所以您可以使用segue和sender參數中的信息來定義segue的上下文並傳遞適當的信息。 例如,如果segue源自表視圖,則sender參數將標識用戶點擊的表視圖單元格。 您可以使用該信息在目標視圖控制器上設置數據。

鑒於此,我首先查看sender參數,並期望它是指向表格單元格的指針。 如果您知道單元格應該在哪個表中,則可以使用-indexPathForCell:來檢索單元格的索引路徑。

您用於准備segue的發件人可以是您想要的任何人。 如果您想知道該行,請發送行或索引路徑:

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {


    NSUInteger rowNumber = [indexPath row];   
    NSString *categoryCode = [self.categoryCodes objectAtIndex:rowNumber];

    self.categoryData = [self.commuterDict objectForKey:categoryCode];

    [self performSegueWithIdentifier:@"ShowPlaces" sender:indexPath];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([[segue identifier] isEqualToString:@"ShowPlaces"]) {

        PlacesViewController *placesViewController = [segue destinationViewController];

        // Row information is supplied as the sender
        NSIndexPath *indexPath = sender;


    }
}

如果要使用實際行,請將其作為發件人

[self performSegueWithIdentifier:@"ShowPlaces" sender:[tableView cellForRowAtIndexPath:indexPath]];

您可以將segue從視圖控制器拖動到按下詳細信息顯示按鈕時要顯示的視圖。 您可以從代碼中觸發segue,如下所示

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"UpdateData" sender:self];
}

來自奧地利馬丁的干杯

如果您的發件人對象是tableviewcell,則以下代碼段應該有效:

NSIndexPath *indexPath = [[[segue sourceViewController] tableView] indexPathForCell:sender];

否則試試

NSIndexPath *indexPath = nil;
if ([sender isMemberOfClass:[UITableViewCell class]]) 
{
    indexPath = [[[segue sourceViewController] tableView] indexPathForCell:sender]; 
}
else if ([[sender superview] isMemberOfClass:[UITableViewCell class]])
{
    indexPath = [[[segue sourceViewController] tableView] indexPathForCell:(UITableViewCell *)[sender superview]];
}
else if ([[[sender superview] superview] isMemberOfClass:[UITableViewCell class]])
{
    indexPath = [[[segue sourceViewController] tableView] indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM