1
votes

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)

1
Please provide your code so that people can properly help you.Fernando Mazzon
Sorry, I'm in the middle of changing things so its a little bit messy.user3712524
How are you trying to go from the first controller to the second? I don't see anything in your code about a segue? What have you done in the storyboard?rdelmar
Ya, I just hav a button on my first view that I am trying to connect to the second view via the control+click/drag method (push).user3712524
You are somehow calling centralManagerDidUpdateState: on ViewController when the method is only implemented in BlueToothViewController. That is causing your crash.Fernando Mazzon

1 Answers

1
votes

Are you using storyboard? If you are, just drag a UINavigationController out (it'll come with a UITableViewController, but just click on that and delete it). Then drag out two view controllers, change their custom classes to your classes. Control-drag from the UINavigationController to your first view controller (set it as the root view controller).

You also need a button or something on the first view controller to trigger the segue. Once you add it, control-drag from the button to the second view controller and select the "push" segue. It's action will be connected to triggering the segue.

Drag the arrow with no ancestor (just a floating arrow) to your UINavigationController, and it should work.