我在学习如何使用segue将数据从单元附件按钮传递到详细视图控制器时遇到大问题。如果我点击单元格,数据将传递到NSString *selectedItem;
中的详细视图控制器,而另一个视图上的标签将更新为单元格中的单词 -
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self performSegueWithIdentifier:@"toDetail" sender:self];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"toDetail"]) {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
DrugDetailViewController *destViewController = segue.destinationViewController;
destViewController.selectedItem = [[candyArray objectAtIndex:[indexPath row]] name];
}
}
我将故事板上的一个segue从单元格连接到详细视图,名称为“toDeatil”当我单击它进入详细信息屏幕的单元格时它会起作用,但如果我放了
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
[self performSegueWithIdentifier:@"toDetail" sender:self];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"toDetail"]) {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
DrugDetailViewController *destViewController = segue.destinationViewController;
destViewController.selectedItem = [[candyArray objectAtIndex:[indexPath row]] name];
}
}
几乎完全相同,但来自accessorybutton
,当我点击单元格时,我将故事板上的segue从单元格accessorybutton
连接到名称为“toDetail
”的详细信息视图它进入细节屏幕,但信息不存在,标签剂量被填写或者只是一直使用第一个细胞细节。
我尝试了大量的组合。我已经尝试在自定义单元格中创建自己的附件按钮UIButton
,但它只是始终使用第一个单元格细节。
目标是让didSelectRowAtIndexPath
转到一个视图,accessoryButtonTappedForRowWithIndexPath
转到另一个视图,但我需要告诉accessoryButtonTappedForRowWithIndexPath
按下了哪个单元格。
希望这样做。
谢谢
答案 0 :(得分:3)
您可以将indexPath
作为sender
传递给performSegueWithIdentifier
来电,如下所示:
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
[self performSegueWithIdentifier:@"toDetail" sender:indexPath];//IndexPath as sender
}
并使用prepareForSegue
方法:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"toDetail"]) {
//Detect sender class and act accordingly
NSIndexPath *indexPath = [sender isKindOfClass:[NSIndexPath class]] ? (NSIndexPath*)sender : [self.tableView indexPathForSelectedRow];
DrugDetailViewController *destViewController = segue.destinationViewController;
destViewController.selectedItem = [[candyArray objectAtIndex:[indexPath row]] name];
}
}
答案 1 :(得分:3)
您无需实施 accessoryButtonTappedForRowWithIndexPath 。
从附件视图触发 prepareForSegue 时,发件人:( id)发件人参数设置为 UITableViewCell ,其中包含附件视图。然后,您可以向表视图询问该单元格的索引(而不是所选索引)。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"toDetail"] && [sender isKindOfClass:[UITableViewCell class]]) {
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
DrugDetailViewController *destViewController = segue.destinationViewController;
destViewController.selectedItem = [[candyArray objectAtIndex:[indexPath row]] name];
}
}
答案 2 :(得分:2)
这是因为[self.tableView indexPathForSelectedRow]
仅在点击ROW时返回NSIndexPath,而不是在点击附件按钮时返回。
在accessoryButtonTappedForRowWithIndexPath
中,您需要手动将indexPath.row
传递给prepareForSegue方法。试试这个:
NSInteger selectedRow;
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
selectedRow = indexPath.row;
[self performSegueWithIdentifier:@"toDetail" sender:self];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"toDetail"])
{
DrugDetailViewController *destViewController = segue.destinationViewController;
destViewController.selectedItem = [[candyArray objectAtIndex:selectedRow] name];
}
}
答案 3 :(得分:0)
如果您在应用程序委托中选择了所选内容的状态,那该怎么办? Raul Juarez的回答是做的,但是发送者参数的目标是其他的!
我有一个使用UITableView的应用程序,我需要知道上面屏幕中附件按钮上触摸了什么项目!
为了管理这个场景,我在应用程序委托上有一个属性,当我触摸桌面视图附件按钮时我会更新;所以在下一个屏幕中,我可以检索读取应用程序代理属性的项目。
通常,我使用de application delegate代码模型应用程序(划分必要的类),因此视图实例只与此模型交互以更新必要的状态!我所做的是专注于独立于模型工作的观看工作!
也许有人这样:
// Property on Application Delegate
@propety (atomic,readwrite) NSIndexPath* indexTapped;
// Method on UITableViewDelegate instance
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
UIMyAppDelegate* model = (UIMyAppDelegate*)[[UIApplication shared] delegate];
model.indexTapped = indexPath;
[self performSegueWithIdentifier:@"toDetail" sender:self];
}
// Method on another View Controller
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
UIMyAppDelegate* model = (UIMyAppDelegate*)[[UIApplication shared] delegate];
if ([segue.identifier isEqualToString:@"toDetail"]) {
NSIndexPath *indexTapped = model.indexSelected;
DrugDetailViewController *destViewController = segue.destinationViewController;
destViewController.selectedItem = [[candyArray objectAtIndex:[indexPath row]] name];
}
}