如何将 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)将数据从一个 vc 传递到另一个 vc - 已关闭