在TableView单元格上添加Segue的正确方法

时间:2014-02-24 08:35:17

标签: ios objective-c uitableview

我有一个应用程序,用户在TableView中选择某一行,该行的内容将被发送到下一个ViewController。

到目前为止,我已经通过Segue将TableView Cell / Row连接到下一个ViewController。我现在面临的问题是将所选行的值传递给下一个ViewController。我已经为didSelectRowAtIndexPathprepareForSegue函数编写了代码。

以下是函数(在ViewController.m文件中,具有TableView的文件):

didSelectRowAtIndexPath功能:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"didSelectRowAtIndexPath entered");

    //itemNameList is a mutable array where I get my TableView data from
    NSMutableString *itemName = [itemNameList objectAtIndex:indexPath.row];

    //selectedItem is a global mutable string I use to store the selected item to.
    selectedItem = itemName;
    UIAlertView *messageAlert = [[UIAlertView alloc]
                             initWithTitle:@"Row Selected"
                             message:itemName
                             delegate:nil
                             cancelButtonTitle:@"OK"
                             otherButtonTitles:nil];

    // Display Alert Message
    [messageAlert show];
}

prepareForSegue功能:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSLog(@"prepareForSegue entered");

    if ([[segue identifier] isEqualToString:@"Details"])
    {
        //DetailViewController is the next ViewController once the user
        //selects an item
        DetailViewController *detailViewController = [segue destinationViewController];

        //the first selectedItem is a property of the second ViewController
        //the next selectedItem is the global mutable string
        detailViewController.selectedItem = selectedItem;
    }
}

问题是prepareForSegue函数首先在didSelectRowAtIndexPath函数之前执行。这是一个很大的问题,因为这意味着我实际上并没有将值传递给第二个ViewController,因为第二个ViewController已经加载到屏幕中。

有谁知道如何处理这个?

我的想法是以某种方式获取用户在prepareForSegue方法中选择的行但我不知道该怎么做。

3 个答案:

答案 0 :(得分:2)

是的,你是对的。 prepareForSegue似乎在didSelectRowAtIndexPath之前执行。因此,您需要在prepareForSegue中选择一行。

使用方法:

NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]

prepareForSegue内获取选定的行。

答案 1 :(得分:0)

删除您在UItableViewCellViewControllerB之间在IB中建立的关联,并在segueViewControllera之间添加ViewControllerB

添加:

[self performSegueWithIdentifier:@"nextVC" sender:nil];

didSelectRowAtIndexPath的末尾。

prepareForSegue完成处理后会触发didSelectRowAtIndexPath

答案 2 :(得分:0)

准备segue

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

    TheNextViewController *tnvc = segue.destinationViewController;

    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
    [self tableView:self.tableView didSelectRowAtIndexPath:indexPath];

 //then do whatever you have to do
 //eg. set property in thenextviewcontroller by tnvc.propertyname = self..