iOS - 错误:无法识别的选择器发送到PrepareForSegue中的实例:

时间:2014-03-11 10:07:21

标签: ios xcode

我想在控制器之间传递数据,但是我收到了这个错误,我在这里被阻止:s

错误:

 [UITabBarController setUID:]: unrecognized selector sent to instance

代码:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
NSString *test = (NSString *)sender;  
if ([segue.identifier isEqualToString:@"segueno"]) {
    FirstViewController *VC = (FirstViewController *)[segue destinationViewController];
    VC.uID = test;
    NSLog(@"%@",VC.uID);
}}

这是storyboaard

enter image description here

3 个答案:

答案 0 :(得分:2)

检查运行时VC的实际类型。看起来你输错了类型。

在行VC.uID = test;上的运行时设置断点期间检查实际类型。在调试窗口中,您应该有:

VC = (RealClass *) 0x312321312

真正的课程不是你所期望的。

最可能的原因是VCUITabBarController。所以你必须替换

FirstViewController *VC = (FirstViewController *)[segue destinationViewController];

UITabBarController *tabBarController = (UITabBarController *)[segue destinationViewController];
// replace 1 with real index of your FirstVC
FirstViewController *VC = [[tabBarController viewControllers] objectAtIndex:1];

答案 1 :(得分:1)

segue目的地是UITabBarController。所以你需要检查viewcontrollers列表。那么基于你可以寻找uID。

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        NSString *test = (NSString *)sender;

        if ([segue.identifier isEqualToString:@"segueno"]) {

            FirstViewController *firstVC ;

            UITabBarController *destinat = [segue destinationViewController];

            if ([destinat isKindOfClass:[UITabBarController class]]) {


                for (id listOfViewControllers in [destinat viewControllers]) {

                    if ([listOfViewControllers isKindOfClass:[FirstViewController class]]) {

                        firstVC = listOfViewControllers;

                        break;
                    }

                }

            }

            firstVC.uID = test;
            NSLog(@"%@",firstVC.uID);
        }}

答案 2 :(得分:0)

以下是我在segues

之间传递managedObjectContext的方法

在您将要传递数据的班级中,使用prepareForSegue调用。 (假设这个类有一个名为 _managedObjectContext 的变量,它可以传递给segue类)

来自Segue的课程:

.h文件:

@property (weak, nonatomic) NSManagedObjectContext *managedObjectContext;

.m文件:

@synthesize managedObjectContext

对@synthesize的调用将产生以下结果:

  • 一个名为 _managedObjectContext
  • 的局部变量
  • getManagedObjectContext
  • 的方法
  • setManagedObjectContext
  • 的方法

另外将以下方法添加到您的班级

// Pass on managedObjectContext
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

// If the destination VC is able to take the setManagedObjectContext method the current objectContext will be passed along.
if ([segue.destinationViewController respondsToSelector:@selector(setManagedObjectContext:)]) {
    [segue.destinationViewController performSelector:@selector(setManagedObjectContext:)
                                          withObject:_managedObjectContext];
} else {

    NSLog(@"Segue to controller [%@] that does not support passing managedObjectContext", [segue destinationViewController]);
 }
}

然后在我的“课堂”中接收我做的数据: 在.h文件中我有

@property (weak, nonatomic) NSManagedObjectContext *managedObjectContext;

并在.m文件中我有:

@synthesize managedObjectContext;

这样做(使用syntehsiation)是一个setManagedObjectContext和getManagedObjectContext调用。在准备segue我检查以确保destinationController将“响应”此方法,如果是这样,数据设置。

清楚?