如何将 indexPath 从 segue 传递到目标视图?

Posted

技术标签:

【中文标题】如何将 indexPath 从 segue 传递到目标视图?【英文标题】:How to pass indexPath from segue to destination view? 【发布时间】:2015-04-23 20:06:00 【问题描述】:

我在自定义布局 collectionView 的页脚中有两个按钮。当用户点击按钮时,我想将 footerView 的 indexPath 传递给 destinationView 类。 我以我之前成功的典型方式编写了我的代码。 但是,出于某种原因,每当我点击按钮时,它都会崩溃。

我为每个按钮尝试了不同的方法来完成这项工作,但都没有奏效。我已将destinationView 的类设置为情节提要中的正确类。请有人帮助我。由于英语不是我的第一语言,因此非常感谢您对代码示例的任何帮助。谢谢。

这是我的代码

    // perform segue passing indexPath information
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 

    // approach 1 : pass dictionary
    if([[segue identifier] isEqualToString:@"SeeAllPictures"]) 
        Footer *footerView = (Footer *)((UIButton *)sender).superview;

        // debug code : working well
        NSLog(@"perform segue from indexpath %ld - %ld", (long) footerView.indexPath.section, (long) footerView.indexPath.row);

        SeeAllPicture *destVC = (SeeAllPicture *)[segue destinationViewController];
        NSDictionary *indexPathDic = @@"key1":footerView.indexPath;
        // crashes at below line
        destVC.indexPathDic = indexPathDic;
    
    // approach 2 : pass indexPath.section, the NSInteger value
    else if([[segue identifier] isEqualToString:@"GoToDiary"]) 
        Footer *footerView = (Footer *)((UIButton *)sender).superview;

        // debug code : working well
        NSLog(@"perform segue from indexpath %ld - %ld", (long) footerView.indexPath.section, (long) footerView.indexPath.row);
        Diary *destVC = (Diary *)[segue destinationViewController];
        // crashes at below line
        destVC.section = footerView.indexPath.section;
    

下面是目标类之一的标题

#import <UIKit/UIKit.h>

@interface SeeAllPicture : UIViewController

@property (strong, nonatomic) IBOutlet UILabel *titleLabel;
@property (strong, nonatomic) NSDictionary *indexPathDic;

@property NSInteger section;

@end

这是我的应用崩溃时的消息

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UINavigationController setIndexPathDic:]: unrecognized selector sent to instance 0x7ff8c8c4f140'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010f7f7a75     __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010f490bb7     objc_exception_throw + 45
    2   CoreFoundation                      0x000000010f7fed1d -    [NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x000000010f7569dc     ___forwarding___ + 988
    4   CoreFoundation                      0x000000010f756578     _CF_forwarding_prep_0 + 120
    5   InfanTree                           0x000000010ea1113b -    [ViewController prepareForSegue:sender:] + 635
    6   UIKit                               0x000000011037e3cc -    [UIStoryboardSegueTemplate _perform:] + 151
    7   UIKit                               0x000000010fe2ba22 -    [UIApplication sendAction:to:from:forEvent:] + 75
    8   UIKit                               0x000000010ff32e50 -[UIControl     _sendActionsForEvents:withEvent:] + 467
    9   UIKit                               0x000000010ff3221f -[UIControl     touchesEnded:withEvent:] + 522
    10  UIKit                               0x00000001101d9e80     _UIGestureRecognizerUpdate + 9487
    11  UIKit                               0x000000010fe71856 -[UIWindow     _sendGesturesForEvent:] + 1041
    12  UIKit                               0x000000010fe72483 -[UIWindow     sendEvent:] + 667
    13  UIKit                               0x000000010fe3efb1 -    [UIApplication sendEvent:] + 246
    14  UIKit                               0x000000010fe4c227     _UIApplicationHandleEventFromQueueEvent + 17700
    15  UIKit                               0x000000010fe2723c     _UIApplicationHandleEventQueue + 2066
    16  CoreFoundation                      0x000000010f72cc91     __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    17  CoreFoundation                      0x000000010f722b5d __CFRunLoopDoSources0 + 269
    18  CoreFoundation                      0x000000010f722194 __CFRunLoopRun + 868
    19  CoreFoundation                      0x000000010f721bc6 CFRunLoopRunSpecific + 470
    20  GraphicsServices                    0x0000000112950a58 GSEventRunModal + 161
    21  UIKit                               0x000000010fe2a580 UIApplicationMain + 1282
    22  InfanTree                           0x000000010ea1b7c3 main + 115
    23  libdyld.dylib                       0x0000000113211145 start + 1
)

【问题讨论】:

看看:***.com/questions/29823846/… 您没有阅读错误的第一行吗?它告诉您您尝试在 UINavigationController 上调用 setIndexPathDic:。这意味着你的destinationViewController 不是你想象的那样。 @rdelmar 谢谢,我删除了 UINavigationController 并且它可以工作。有没有其他方法可以做同样的工作来维护 UINavigationController? 当然。你需要有类似UINavigationController *nav = segue.destinationViewController; SeeAllPicture *destVC = nav.topViewController; 【参考方案1】:

看起来您的 SeeAllPicture 视图控制器嵌入在 UINavigationController 中。在这种情况下,segue 上的 destinationViewController 是导航控制器而不是您的 SeeAllPicture 视图控制器。

您可能想要destinationViewController 中的topViewController

UINavigationController *navigationVC = (UINavigationController *)[segue destinationViewController];
SeeAllPicture *destVC = navigationVC.topViewController;

【讨论】:

【参考方案2】:

正如 rdelmar 所说,它很好,但要让它无崩溃,您可以使用isKindOfClass: 来检查课程。无论如何,只需在之后设置一个断点 SeeAllPicture *destVC = (SeeAllPicture *)[segue destinationViewController]; 并检查 XCode 中的控制台,在这里你会发现该类是一种 UINavigationController :)

【讨论】:

以上是关于如何将 indexPath 从 segue 传递到目标视图?的主要内容,如果未能解决你的问题,请参考以下文章

Segue 没有得到选定的行号

Segue 不传递正确的行的索引路径总是第 0 节

将结果从 Swift 数组传递到 Segue 到描述

我如何使用推送方法(无 segue)将数据从一个 vc 传递到另一个 vc - 已关闭

从选定的 TableView Cell Swift Xcode 传递 var

如何在 Swift 中通过 Segue 将数据传递到下一个视图?