Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在TableView单元格上添加Segue的正确方法_Ios_Objective C_Uitableview - Fatal编程技术网

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

Ios 在TableView单元格上添加Segue的正确方法,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我有一个应用程序,用户在TableView中选择某一行,该行的内容将发送到下一个ViewController 到目前为止,我已经通过Segue将TableView单元格/行连接到下一个ViewController。我现在面临的问题是将所选行的值传递给下一个ViewController。我已经为didSelectRowAtIndexPath和prepareForSegue函数编写了代码 以下是函数(在ViewController.m文件中,具有TableView的函数): didSelectRow

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

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

以下是函数(在
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];
}
- (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;
    }
}
prepareforsgue
功能:

- (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];
}
- (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
函数在
didselectrowatinexpath
函数之前先执行。这是一个很大的问题,因为这意味着我实际上无法将值传递给第二个ViewController,因为第二个ViewController已经加载到屏幕中

有人知道怎么处理吗


我的想法是以某种方式获得用户在
prepareforsgue
方法中选择的行,但我也不知道如何做到这一点。

是的,你是对的。
prepareForSegue
似乎在
didSelectRowAtIndexPath
之前执行。因此,您需要在
prepareforsgue
中获取所选行

使用以下方法:

NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]

prepareForSegue
内获取所选行。

删除在IB中
UItableViewCell
ViewControllerB
之间建立的连接,并在
ViewControllera
之间添加一个
segue

加:

的末尾选择rowatindexpath


这样,
didselectrowatinexpath
完成处理后将触发
prepareforsgue

准备继续

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..

发件人是一个单元格:)