我有一个应用程序,用户在TableView中选择某一行,该行的内容将被发送到下一个ViewController。
到目前为止,我已经通过Segue将TableView Cell / Row连接到下一个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];
}
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
方法中选择的行但我不知道该怎么做。
答案 0 :(得分:2)
是的,你是对的。 prepareForSegue
似乎在didSelectRowAtIndexPath
之前执行。因此,您需要在prepareForSegue
中选择一行。
使用方法:
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]
在prepareForSegue
内获取选定的行。
答案 1 :(得分:0)
删除您在UItableViewCell
和ViewControllerB
之间在IB中建立的关联,并在segue
到ViewControllera
之间添加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..