【问题标题】:in iOS app, why does prepareForSegue occur before didSelectRowAtIndexPath在iOS应用程序中,为什么prepareForSegue发生在didSelectRowAtIndexPath之前
【发布时间】:2012-04-29 23:38:43
【问题描述】:

我正在尝试将单元格行为更改为: 1)当单元格被点击时,将单元格标记为完整并带有复选标记 2) 当点击 Detail Disclosure Accessory 按钮时,执行 Segue。 3)在tableView:didSelectRowAtIndexPath:我有:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    AWDelivery *delivery = [self.fetchedResultsController objectAtIndexPath:indexPath];
    [delivery toggleDelivered: delivery];
    [self configureCheckmarkForCell:cell withDelivery:delivery];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    if (debugging) NSLog(@"[%s] [%d]", __PRETTY_FUNCTION__, __LINE__);
}

deselectRowAtIndexPath 应该绕过 segue,但事实并非如此。

NSLogs: a) 在 2012-04-29 18:50:00.848 Delivery[3148:fb03] [-[DeliveryTVC prepareForSegue:sender:]] [168] b) 在 2012-04-29 18:50:01.245 Delivery[3148:fb03] [-[DeliveryTVC tableView:didSelectRowAtIndexPath:]] [93]

请注意,“didSelect”出现在“prepareForSegue”之后。

任何提示将不胜感激。

【问题讨论】:

  • 你能分享你的代码吗?我有同样的问题。谢谢。
  • 非常随机,但从您的代码示例中,我了解了 __PRETTY_FUNCTION__ 和 __LINE__ 宏。谢谢!

标签: iphone ios5


【解决方案1】:

您的详细信息是否已附加到表格视图单元格?相反,请尝试在两个视图控制器之间拖动它(一个包含表格,另一个是您希望它去的地方)。

然后在tableView:accessoryButtonTappedForRowWithIndexPath:时手动执行([self performSegueWithIdentifier:@"MySegue"];)。

【讨论】:

  • 请您添加一些代码来手动执行segue!我有一个相同的问题,我想将单元格信息传递给下一个视图控制器。您的意思是手动执行呈现模态视图控制器还是 prepareforsegue 方法?谢谢。
  • 当然,无论你需要在视图控制器中,说:[self performSegueWithIdentifier:@"MySegue"];该字符串应与您在 IB 中为 segue 设置的标识符匹配。如果您需要更多详细信息,请告诉我。
【解决方案2】:

如果需要在prepareForSegue中获取当前tableview选择,可以通过访问UITableViewController的tableView ivar来获取;

[self tableView] indexPathForSelectedRow]

【讨论】:

  • 点击附件按钮不会选择单元格,因此 indexpath.row 与点击附件的正确单元格不对应。
【解决方案3】:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Make sure your segue name in storyboard is the same as this line
    if ([[segue identifier] isEqualToString:@"ClaimDetailsSeque"])
    {
        DLog(@"destinationViewController %@",[[segue destinationViewController] topViewController]);
        //This syntax is needed when the seque is going through a Navagation Controller
        ClaimDetailsFormViewController* vc = (ClaimDetailsFormViewController*)[[segue destinationViewController] topViewController];

        //This the the way to get the object from the selected row via the FetchedResultsController
        //this is needed because prepareForSegue is called before didSelectRowAtIndexPath
        NSIndexPath *selectedIndexPath = [self->claimTableView indexPathForSelectedRow];
        ClaimHistory *object = [[self claimHistoryFetchedResultsController] objectAtIndexPath:selectedIndexPath];

        MyClaimHistorySM *myCH = [MyClaimHistorySM new];

        myCH.policyNumber = object.policyNumber;
        myCH.policyStatus = object.policyStatus;
        myCH.claimNumber  = object.claimNumber;
        myCH.insuredName = object.insuredName;
        myCH.lossDescription = object.lossDescription;
        myCH.dateOfLoss = object.dateOfLoss;
        myCH.incidentCloseDt = object.incidentCloseDt;

        vc.claimHistorySM = myCH;

    }

}

【讨论】:

  • 在 IB 中通过选择 Table View Cell 并将触发的 Segues 选择“连接器”拖动到导航控制器来创建 segue。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 2019-06-05
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多