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