情况:
我有三个名为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
BlueToothCheckerView
和BlueToothCheckerViewController
至少显示字符串 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回答,我还检查了我的构建阶段。如果重要的话,这就是它的样子。
有什么想法吗?
答案 0 :(得分:1)
我相信你的问题是:
BlueToothCheckerView *btcv = [segue destinationViewController];
虽然您说目标控制器是BlueToothCheckerView
,但错误消息显示它确实是BlueToothCheckerViewController
。
由于控制器没有属性,因此失败。