ios:NSInvalidArgumentException,prepareForSegue上无法识别的选择器

时间:2015-08-04 12:28:26

标签: ios objective-c

情况:

我有三个名为LogInView,CategoryRegistrationView和BlueToothCheckerView的视图。 LogInView和CategoryRegistrationView都可以转到BlueToothCheckerView。

BlueToothCheckerView本身可以分为两个不同的视图,具体取决于LogInView或CategoryRegistrationView设置的字符串。

LogInView做得很好。用户可以从LogInView登录,检查他的蓝牙连接是否在BlueToothCheckerView中打开,然后重定向到一个视图,如果他从CategoryRegistrationView进入,他将看不到。

CategoryRegistrationView有问题。

问题:

单击按钮将我带到BlueToothView,会出现此错误:

[BlueToothCheckerViewController setFromSegue:]: unrecognized selector sent to instance 0x7f8c935a4f80

很多在线帖子表明,这是因为BlueToothCheckerView没有设置为xib BlueToothView的自定义类,但它是。

代码(我们将专注于CategoryRegistrationView和BlueToothCheckerView来缩短时间):

CategoryRegistrationViewController.h - 问题段:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
    NSLog(@"Segue Identifier: %@", [segue identifier]);

    if ([[segue identifier] isEqualToString:@"CategoryRegistrationToBlueToothCheckerSegue"]) {
        BlueToothCheckerView *btcv = [segue destinationViewController];
        btcv.fromSegue = @"CategoryRegistrationToBlueToothCheckerSegue"; // <-- Error here
        NSLog(@"Something wrong here");
    }
}

注意:LogInViewController具有完全相同的代码,而 btvc.fromSegue 设置为“LoginToBlueToothCheckerSegue”。

BlueToothCheckerView.h

#import <UIKit/UIKit.h>

@protocol BlueToothCheckerViewDelegate <NSObject>

@required
- (void)skipPressed:(id)sender;
@end

@interface BlueToothCheckerView : UIView

@property (weak, nonatomic) id<BlueToothCheckerViewDelegate> delegate;
@property (weak, nonatomic) IBOutlet UIButton *SkipButton;
@property (nonatomic) NSString* fromSegue;

- (IBAction)skipPressed:(id)sender;

@end

BlueToothCheckerViewController.h

#import "BaseUIViewController.h"
#import "BlueToothCheckerView.h"
#import "Constants.h"
#import <CoreBluetooth/CoreBluetooth.h>

@interface BlueToothCheckerViewController : BaseUIViewController <BlueToothCheckerViewDelegate,CBCentralManagerDelegate>

@property (weak, nonatomic) BlueToothCheckerView *btcv;

@end

BlueToothCheckerViewBlueToothCheckerViewController至少显示字符串 fromSegue

以下是BlueToothCheckerViewController.m中使用 fromSegue 的示例:

- (void)skipPressed:(id)sender {
    NSLog(@"Bluetooth already on");

    if ([self.btcv.fromSegue isEqual: @"LoginToBlueToothCheckerSegue"]){
        [self performSegueWithIdentifier:@"BlueToothCheckerToDashboardSegue" sender:self];
    }
    else if ([self.btcv.fromSegue isEqual: @"CategoryRegistrationToBlueToothCheckerSegue"]){
        [self performSegueWithIdentifier:@"BlueToothCheckerToWalkthroughSegue" sender:self];
    }
}

我尝试过的事情:

我尝试删除有问题的segue,然后重新添加。它并没有多少。我还评论了btcv.fromSegue = @"CategoryRegistrationToBlueToothCheckerSegue";行,并确认程序在没有它的情况下运行良好。

我也尝试过为BlueToothCheckerController添加一个强制转换器。也没用。

根据this回答,我还检查了我的构建阶段。如果重要的话,这就是它的样子。

enter image description here

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我相信你的问题是:

BlueToothCheckerView *btcv = [segue destinationViewController];

虽然您说目标控制器是BlueToothCheckerView,但错误消息显示它确实是BlueToothCheckerViewController

由于控制器没有属性,因此失败。