I am new to this but I have a question about Xcode. I figured out how to get my view controller embedded in a navigation controller, but how do i get a segue from the first view to a second view to work? I have two views, and I need to segue between them, but it keeps giving me a thread1 SIGABRT message. I tried making the segue modal and this does not work. When I try to embed my second view controller in a navigation controller it creates a new navigation controller. Any advice?
#import <UIKit/UIKit.h>
#import <CoreBluetooth/CoreBluetooth.h>
@interface ViewController : UIViewController
@property (strong, nonatomic) CBCentralManager *centralManager;
@property (strong, nonatomic) CBPeripheral *discoveredPerepheral;
@property (strong, nonatomic) NSMutableData *data;
@property (strong, nonatomic) IBOutlet UITextView *textview;
@property (weak, nonatomic) IBOutlet UILabel *isConnected;
@property (weak, nonatomic) IBOutlet UILabel *myPeripherals;
@property (weak, nonatomic) IBOutlet UILabel *aLabel;
@end
#import "ViewController.h"
@implementation ViewController
- (IBAction)connect:(id)sender {
_centralManager = [[CBCentralManager alloc]initWithDelegate:self queue:nil options:nil];
_data = [[NSMutableData alloc]init];
}
- (void)viewDidLoad {
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
#import <UIKit/UIKit.h>
#import "ViewController.h"
@interface BlueToothViewController : UIViewController
@property (strong, nonatomic) CBCentralManager *centralManager;
@property (strong, nonatomic) CBPeripheral *discoveredPerepheral;
@property (strong, nonatomic) NSMutableData *data;
@property (strong, nonatomic) IBOutlet UITextView *textview;
@property (weak, nonatomic) IBOutlet UILabel *isConnected;
@property (weak, nonatomic) IBOutlet UILabel *myPeripherals;
@property (weak, nonatomic) IBOutlet UILabel *aLabel;
- (void)centralManagerDidUpdateState:(CBCentralManager *)central;
- (void)centralManger:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI;
-(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;
-(void)cleanup;
-(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error;
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;
-(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;
-(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error;
-(void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error;
@end
#import "BlueToothViewController.h"
@interface BlueToothViewController ()
@end
@implementation BlueToothViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad {
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[_centralManager stopScan];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
//you should test all scenarios
if (central.state == CBCentralManagerStateUnknown) {
self.aLabel.text = @"I dont do anything because my state is unknown.";
return;
}
if (central.state == CBCentralManagerStatePoweredOn) {
//scan for devices
[_centralManager scanForPeripheralsWithServices:nil options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES }];
NSLog(@"Scanning Started");
}
if (central.state == CBCentralManagerStateResetting) {
self.aLabel.text = @"I dont do anything because my state is resetting.";
return;
}
if (central.state == CBCentralManagerStateUnsupported) {
self.aLabel.text = @"I dont do anything because my state is unsupported.";
return;
}
if (central.state == CBCentralManagerStateUnauthorized) {
self.aLabel.text = @"I dont do anything because my state is unauthorized.";
return;
}
if (central.state == CBCentralManagerStatePoweredOff) {
self.aLabel.text = @"I dont do anything because my state is powered off.";
return;
}
}
- (void)centralManger:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
NSLog(@"Discovered %@ at %@", peripheral.name, RSSI);
self.myPeripherals.text = [NSString stringWithFormat:@"%@%@",peripheral.name, RSSI];
if (_discoveredPerepheral != peripheral) {
//save a copy of the peripheral
_discoveredPerepheral = peripheral;
//and connect
NSLog(@"Connecting to peripheral %@", peripheral);
[_centralManager connectPeripheral:peripheral options:nil];
}
}
-(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {
NSLog(@"Failed to connect");
[self cleanup];
}
-(void)cleanup {
//see if we are subscribed to a characteristic on the peripheral
if (_discoveredPerepheral.services != nil) {
for (CBService *service in _discoveredPerepheral.services) {
if (service.characteristics != nil) {
for (CBCharacteristic *characteristic in service.characteristics) {
if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:@"508EFF8E-F541-57EF-BD82-B0B4EC504CA9"]]) {
if (characteristic.isNotifying) {
[_discoveredPerepheral setNotifyValue:NO forCharacteristic:characteristic];
return;
}
}
}
}
}
}
[_centralManager cancelPeripheralConnection:_discoveredPerepheral];
}
-(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
NSLog(@"Connected");
[_centralManager stopScan];
NSLog(@"Scanning stopped");
self.isConnected.text = [NSString stringWithFormat:@"Connected"];
[_data setLength:0];
peripheral.delegate = self;
[peripheral discoverServices:nil];
}
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
if (error) { [self cleanup];
return;
}
for (CBService *service in peripheral.services) {
[peripheral discoverCharacteristics:nil forService:service];
}
//discover other characteristics
}
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error { if (error) { [self cleanup];
return;
}
for (CBCharacteristic *characteristic in service.characteristics) {
if ([characteristic.UUID isEqual:nil]) {
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
}
}
}
-(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
if (error) { NSLog(@"Error");
return;
}
NSString *stringFromData = [[NSString alloc]initWithData:characteristic.value encoding:NSUTF8StringEncoding];
//Have we got everything we need?
if ([stringFromData isEqualToString:@"EOM"]) {
[_textview setText:[[NSString alloc]initWithData:self.data encoding:NSUTF8StringEncoding]];
[peripheral setNotifyValue:NO forCharacteristic:characteristic];
[_centralManager cancelPeripheralConnection:peripheral];
}
}
-(void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
if ([characteristic.UUID isEqual:nil]) {
return;
}
if (characteristic.isNotifying) {
NSLog(@"Notification began on %@", characteristic);
}
else {
[_centralManager cancelPeripheralConnection:peripheral];
}
}
-(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {
_discoveredPerepheral = nil;
self.isConnected.text = [NSString stringWithFormat:@"Connecting..."];
[_centralManager scanForPeripheralsWithServices:nil options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES}];
}
@end
2014-06-05 13:51:28.809 BlindPed[7044:60b] -[ViewController centralManagerDidUpdateState:]: unrecognized selector sent to instance 0x8cafb50 2014-06-05 13:51:28.812 BlindPed[7044:60b] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ViewController centralManagerDidUpdateState:]: unrecognized selector sent to instance 0x8cafb50' * First throw call stack: ( 0 CoreFoundation 0x017f11e4 exceptionPreprocess + 180 1 libobjc.A.dylib 0x015708e5 objc_exception_throw + 44 2 CoreFoundation 0x0188e243 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275 3 CoreFoundation 0x017e150b ___forwarding_ + 1019 4 CoreFoundation 0x017e10ee _CF_forwarding_prep_0 + 14 5 CoreBluetooth 0x01a46567 -[CBCentralManager xpcConnectionIsInvalid:] + 59 6 CoreBluetooth 0x01a4fd33 62-[CBXpcConnection initWithDelegate:queue:options:sessionType:]_block_invoke20 + 82 7 libdispatch.dylib 0x01c207b8 _dispatch_call_block_and_release + 15 8 libdispatch.dylib 0x01c354d0 _dispatch_client_callout + 14 9 libdispatch.dylib 0x01c23726 _dispatch_main_queue_callback_4CF + 340 10 CoreFoundation 0x0185643e __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE + 14 11 CoreFoundation 0x017975cb __CFRunLoopRun + 1963 12 CoreFoundation 0x017969d3 CFRunLoopRunSpecific + 467 13 CoreFoundation 0x017967eb CFRunLoopRunInMode + 123 14 GraphicsServices 0x038175ee GSEventRunModal + 192 15 GraphicsServices 0x0381742b GSEventRun + 104 16 UIKit 0x00230f9b UIApplicationMain + 1225 17 BlindPed 0x0000526d main + 141 18 libdyld.dylib 0x01e6a701 start + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)