NSNotification 예제

최상위뷰가 있다.

최상위 뷰에서 부모뷰를 띄웠다. 

부모뷰에서 자식 뷰를 띄웠다.

 

이때, 자식뷰를 닫을때 부모뷰까지 같이 닫아 줘야하는 요구사항이 있다. 이럴때는 NSNotification 을 사용한다.

 

먼저 부모뷰에 NSNotification 설정과 콜백메소드(편의상 이렇게 부르겠다)를 작성해준다.

viewdidload{

    //노티피케이션 등록 - 자식창을 닫을때 이곳(부모)도 닫히게 노티 등록

    [[NSNotificationCenter defaultCenter] addObserver:self

    selector:@selector(closeViewControllerBySelf:)

        name:@"close"

      object:nil];

}

이렇게 셋팅을 해주고 호출될 메소드를 작성해준다.

//자식창 닫힐때 부모창도 같이 닫히게

-(void) closeViewControllerBySelf:(NSNotification *) notification{

    NSLog(@"부모창이 콜되었습니다.");

    NSString *message = [notification.userInfo objectForKey:@"message"];

    NSLog(@"자식창에서 던져준 메시지 :  %@", message); //취소팝업 뷰 컨트롤러에서 던진 확인용 메시지입니다

    //화면닫기

    [self dismissViewControllerAnimated:YES completion:^{

        //부모창 닫기 성공

    }];

}

이제 자식 뷰 로직을 보자.

//닫기 버튼 눌렀을때!

- (IBAction)cancelAction:(id)sender {    

    //창 닫기

    [self dismissViewControllerAnimated:YES completion:^{

        //창이 닫힐때 작성을 해주어야 한다. 위에 작성하면 이 창을 호출한 부모창은 닫히지 않는다.

        NSDictionary *userInfo = @{ @"message": @"취소팝업 뷰 컨트롤러에서 던진 확인용 메시지입니다." };

        [[NSNotificationCenter defaultCenter] postNotificationName:@"close"

                                        object:nil

                                        userInfo:userInfo];

        // [[self view] removeFromSuperview];

    }];

}

 

자식뷰에서 창이 닫힐때 NSNotificationCenter를 이용해서 postNotificationName에해당 이름을넣고 창을 닫아주면,부모창의 NSNotificationCenter메소드가 호출된다

참고:http://seorenn.blogspot.com/2014/05/cocoa-nsnotification.html

30초 카운트 다운 타이머 만들기 

(countdownlabel 객체는 storybord에 미리 만들어 놓는다.)

#import <UIKit/UIKit.h>

@interface SosRequestViewController : UIViewController 

//타이머 객체

@property(strong,nonatomic)  NSTimer *CountDownTimer;

@property (nonatomic, assign) NSInteger second;

@end

 

.m

//타이머 시작!
-(void)startTimer{
    
        //폰트를 넣어줘야, lable 위치가 흔들리지 않는다.
        UIFont *myfont = [UIFont monospacedDigitSystemFontOfSize:_countDownLabel.font.pointSize weight:UIFontWeightRegular];
        //타임 인터벌 변수 초기화
        _second = 30;
        //타이머 시작 - 화면에 촬영시간 표시해주기
        _CountDownTimer =  [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
        self-&gt;_second -= 1;
        
        NSString *labelContent = [NSString stringWithFormat:@"미입력시 %0.2ld초 후 \n구조요청이 자동으로 발송 됩니다.", self-&gt;_second];
        
        //줄간격 조정
        NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelContent];
        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        //줄간격
        [paragraphStyle setLineSpacing:12];
        //가운데 정렬
        [paragraphStyle setAlignment:NSTextAlignmentCenter];
        //속성 셋팅
        [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelContent length])];
            
        //폰트를 넣어줘야 라벨 위치가 흔들리지 않는다.
        self-&gt;_countDownLabel.font = myfont;
        //라벨의 줄 라인 무한대로
        [self-&gt;_countDownLabel setNumberOfLines:0];
        
        self-&gt;_countDownLabel.attributedText = attributedString;
            
            
        if(self-&gt;_second == 0){
            
            //타이머 정지
            [self-&gt;_CountDownTimer invalidate];
            self-&gt;_CountDownTimer = nil;
            
            //타이머 라벨 및 변수 초기화
            self-&gt;_countDownLabel.text = [NSString stringWithFormat:@"미입력시 %0.2d초 후 \n구조요청이 자동으로 발송 됩니다.", 30];
            //폰트를 넣어줘야 라벨 위치가 흔들리지 않는다.
            self-&gt;_countDownLabel.font = myfont;
            //라벨의 줄 라인 무한대로
            [self-&gt;_countDownLabel setNumberOfLines:0];
            self-&gt;_second = 30;
            //자동으로 구조요청 sms 발송
            //[_recordButton sendActionsForControlEvents:UIControlEventTouchUpInside];
            
        }
    }];
}

 

//단순 메시지 전달해서 팝업 띄우기 메소드

- (void)popUpWithMessage:(NSString *)message {

   

    UIAlertController * alert=   [UIAlertController

                                  alertControllerWithTitle:@"알림"

                                  message:message

                                  preferredStyle:UIAlertControllerStyleAlert];

    

    UIAlertAction* ok = [UIAlertAction

                         actionWithTitle:@"OK"

                         style:UIAlertActionStyleDefault

                         handler:^(UIAlertAction * action)

                         {

        [alert dismissViewControllerAnimated:YES completion:nil];

        

    }];

    

    

    [alert addAction:ok];

    

    

    [self presentViewController:alert animated:YES completion:nil];

 

}

.h

//인디케이터 객체 선언

@property (nonatomic, retain) UIActivityIndicatorView *activityIndicator;

 

.m

//인디케이터 시작

-(void)startIndicater{

    NSLog(@"인디케이터 시작");

    // ProgressBar Setting

    _activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 32, 32)];

    [_activityIndicator setCenter:self.view.center];

    [_activityIndicator setColor:UIColor.whiteColor];

    if (@available(iOS 13.0, *)) {

        [_activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleLarge];

    } else {

        // Fallback on earlier versions

        [_activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge];

    }

    [self.view addSubview : _activityIndicator];

    

    // ProgressBar Start

    _activityIndicator.hidden= FALSE;

    [_activityIndicator startAnimating];

}

 

//인디케이터 종료

-(void)endIndicatter{

    NSLog(@"인디케이터 끝");

    [_activityIndicator stopAnimating];

    _activityIndicator.hidden= TRUE;   

}

  //디바이스 사이즈 구하기

  CGRect screenRect=[[UIScreen mainScreen]bounds];

  CGFloat deviceWidth=screenRect.size.width;

  CGFloat deviceHeight=screenRect.size.height;


//xib
파일 이름으로 뷰컨트롤러 객체 생성

_cancelViewController=[[CancelViewController alloc]initWithNibName:@"CancelViewController" bundle:nil];

 

//상단에 얻은 디바이스 크기로 뷰를 호출하기전에 리사이즈 합니다.

[_cancelViewController.view setFrame:CGRectMake(0, 0, deviceWidth, deviceHeight)];

 

 //취소 알림창 뷰 컨트롤러 띄워주기

[self presentViewController:_cancelViewController animated:YES completion:nil];

viewDidLoad 에서 alertViewController를 띄우면 계층구조 오류 메시지를 던지고 alert가 뜨지 않는다. 처음에는, 뷰가 로드 되었는데 왜 안떠? 라고 생각하고 구글에서 삽질을 좀 했다. 알고봤더니 뷰가 로드는 되었지만 나타나지는 않았기 때문에 viewDidLoad에서 alert 를 띄우면 alert를 띄울수 있는 부모 viewcontroller가 없다고 난 에러였다. 그래서 viewController에서 alert를 띄울려면 viewDidLoad 말고viewDidAppear 이나 다른 메소드를 만들어서 alert를 띄어줘야 한다.

문자 타입의 바이트를 NSData타입으로 변환

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Util : NSObject

// 문자 타입의 바이트를 NSData타입으로 변환
+(NSMutableData *)convertStringToNSData:(NSString *) bytesString;

@end

NS_ASSUME_NONNULL_END

 

#import "Util.h"

@implementation Util
// 문자 타입의 바이트를 NSData타입으로 변환
+(NSMutableData *)convertStringToNSData:(NSString *) bytesString{
    //넘어온 문자형식의 byte
    NSString *signNum = bytesString;
    
    signNum = [signNum stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSMutableData *commandToSend= [[NSMutableData alloc] init];
    unsigned char whole_byte;
    char byte_chars[3] = {'\0','\0','\0'};
    int i;
    for (i=0; i < [signNum length]/2; i++) {
        byte_chars[0] = [signNum characterAtIndex:i*2];
        byte_chars[1] = [signNum characterAtIndex:i*2+1];
        whole_byte = strtol(byte_chars, NULL, 16);
        [commandToSend appendBytes:&whole_byte length:1];
    }
    NSLog(@"Util에서 변환한 결과값 : %@", commandToSend);
    
    return commandToSend;
}


@end
//쿼츠코어를 임포트해야 CALayer 와 CoreAnimation을 사용할 수 있다.
#import <QuartzCore/QuartzCore.h>
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.


    //  #.정의 : CALayer는 스크린에 시각적 큰텐츠를 그리는 사각형의 class 이다.

    //self.view 는 viewcontroller 의 view 이다 . 이를통해 컨트롤러의 view 에 접근할 수 있다.
    //여기서 자동생성된 layer는 calayer이다.
        
    //배경색 오렌지색
    self.view.layer.backgroundColor = [UIColor orangeColor].CGColor;
    //모서리를 20 포인트 만큼 둥글게
    self.view.layer.cornerRadius = 20.0;
    
    self.view.layer.frame = CGRectInset(self.view.layer.frame, 50, 50);
    
    
    
    
    //calayer도 여러 하위 레이어를 가질 수 있다.
    CALayer *sublayer = [CALayer layer];
    //파란색 설정
    sublayer.backgroundColor = [UIColor blueColor].CGColor;
    //그림자
    sublayer.shadowOffset = CGSizeMake(0, 30);
    sublayer.shadowRadius = 10.0;
    sublayer.shadowColor = [UIColor blackColor].CGColor;
    sublayer.shadowOpacity = 0.8;
    sublayer.frame = CGRectMake(30, 30, 128, 192);
    
    
    
    //하위 레이어 위에 이미지 추가하기.
    sublayer.contents = (id)[UIImage imageNamed:@"smile.jpeg"].CGImage;
    sublayer.borderColor = [UIColor blackColor].CGColor;
    sublayer.borderWidth = 2.0;

    
    //최상위 레이어에 하위 레이어 추가하기
    [self.view.layer addSublayer:sublayer];

}


@end


참고

 

[iOS] CALayer 소개

iPhone 프로그래밍을 해보신 분이라면 UIView에 대해서 잘 아실것입니다. Button, TextArea, Slider, WebView 등 대부분이 UIView를 상속하여 구현되어 있습니다. 그러나 UIVIew가 내부적으로 어떻게 구성되어 있..

points.tistory.com

http://minsone.github.io/mac/ios/coreanimationlayer-and-view

 

[CoreAnimation]Layer

레이어와 뷰 iOS나 Mac OS 앱을 개발할 때 뷰를 많이 사용합니다. 뷰는 이미지, 비디오, 글자들을 보여주는 객체이며 터치, 제스쳐 등의 유저가 행하는 것을 잡아서 처리할 수 있습니다. 또한, 뷰는 각각의 뷰를 subview로 관리까지 합니다. UIView에서 렌더링, 레이아웃, 애니메이션 등을 관리하는 코어 애니메이션 클래스인 CALayer가 있습니다. UIView와는 유사한 개념이긴 하지만 화면에 대한 특성만 가지고 있습니다. 모든 UIView는

minsone.github.io

http://seorenn.blogspot.com/2017/02/calayer.html?m=1

.h 파일

#import <AVFoundation/AVFoundation.h>

//사운드를 재생할 오디오 플레이어객체 , 

@property (nonatomic,strong)AVAudioPlayer *player;

 

.m 파일

    /*

     로컬에 sound 파일 재생하기 위한 경로를 가져온다.

     경로를 url 타입으로 변환 - > avaudioplayer로 재생.

     */

    NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"sos" ofType:@"wav"];

    NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];

    NSLog(@"soundFileURL : %@" , soundFileURL);

    NSError *error;

    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL  error:&error];

    self.player.numberOfLoops = -1; //반복

    [self.player play];

objective c 블루투스 corebluetooth

#import "SosRequestViewController.h"
#import <UIKit/UIKit.h>
//코어 블루투스 라이브러리 추가한것 임포트 한다.
#import <CoreBluetooth/CoreBluetooth.h>


//센트럴의 이벤트를 수행할 수 있도록, 델리게이트 구현
@interface ViewController : UIViewController <CBCentralManagerDelegate,CBPeripheralDelegate>

@property (strong, nonatomic) CBCentralManager *centralManager; //센트럴 역할을 수행해줄 객체
@property (strong, nonatomic) CBPeripheral *safetyPeripheral;   //주변기기 객체
@property (strong, nonatomic) CBCharacteristic *characteristic;   //특성정보


//좌측 상단, ble 연결 체크 이미지
@property (weak, nonatomic) IBOutlet UIImageView *bleOnOffImage;

//중앙 상단, ble 상태 메시지
@property (weak, nonatomic) IBOutlet UILabel *bleModeStateText;

//정중앙, ble 파란색 연속 이미지
@property (weak, nonatomic) IBOutlet UIImageView *bleCenterImage;

//정중앙, 이미지 변경을 위한 타이머
@property (weak, nonatomic) NSTimer *imageTimer;

//정중앙, 이미지 변경을 위한 배열
@property (nonatomic, strong) NSArray *imagesList;


//블루투스 모드 on off 모드 버튼
@property (weak, nonatomic) IBOutlet UIButton *bleOnOffButton;

//경고 문구 1
@property (weak, nonatomic) IBOutlet UILabel *warningLabel;


//블루투스 연결 모드 of off 체크 (실제연결체크 아님)
@property (nonatomic, assign) BOOL BleOnOffCheck;

@end

 


//블루투스 관련 기기 정보 상수
#define DEVICE_NAME @"이름"                                                   //블루투스 이름
#define SAFETY_BLE_SERVICE @"서비스아이디"              //서비스 uuid
#define SAFETY_BLE_CHARACTERISTIC @"특성아이디"      //특성 uuid

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

//센트럴 매니저 초기화
-(void) initCentralManager{
      //센트럴 매니저 초기화 + 대리자 설정
      //이제 블루투스 기능을 사용할 수 있고, 관리할 수 있다
      _centralManager = [[CBCentralManager alloc]initWithDelegate:self queue:nil];
}

//화면이 로드되었을때
- (void)viewDidLoad {
    [super viewDidLoad];
   
    //센트럴 매니저 초기화
    [self initCentralManager];

    //블루투스 스캔 초기 값 : NO 셋팅
    _BleOnOffCheck = NO;
    
    [self colorWord];
}


//블루투스 상태 확인 - centralManager가 생성될 때 한번 호출되고,
//나중에 상태가 변경될 때마다 호출되기 때문에 필요한 로직을 추가 할 수 있다.
- (void) centralManagerDidUpdateState:(CBCentralManager *)central{
    
    //휴대폰의 블루투스가 켜져있을 경우.
    if(central.state == CBManagerStatePoweredOn){
        //주변 장치를 찾을 수 있는 유일한 상태!
        NSLog(@"CBManagerStatePoweredOn");
        //앱에서 블루투스 스캔 ON 일경우
        if(_BleOnOffCheck == YES){
            NSLog(@"블루투스 스캔 ON 상태. 주변 기기 스캔 중...");
            //주변 기기 스캔 작동 중...
            [_centralManager scanForPeripheralsWithServices:nil options:nil];
        }else{
        //OFF 일경우
            NSLog(@"블루투스 스캔 OFF 상태");
        }
    }
    
}


//블루투스가 on 상태, 연결가능 기기 목록 검색
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI{
    NSLog(@"bluetooth 연결 가능 기기");
    NSLog(@" name : %@", peripheral.name);
    NSLog(@" service : %@", peripheral.services);
    NSLog(@" state : %ld", (long)peripheral.state);
    NSLog(@"=======================================");
    
    
    //특정 기기 찾기
    //블루투스 기기 이름이 Safety 라면
    if([peripheral.name isEqualToString:DEVICE_NAME]){
        
        
    //######## 휴대폰에서 특정 0x01 값을 던지면 연결 하기!####
        if(YES){
            
            //로직 작성
        }
        
        
        //원하는 블루투스 기기를 찾았기 때문에, central은 스캔 중지 시켜준다.
        [_centralManager stopScan];
        
        //찾은 주변기기 맴버변수에 할당
        _safetyPeripheral = peripheral;
        
        //대리자를 할당해주어야 프로토콜의 메소드를 사용할 수 있다!
        _safetyPeripheral.delegate = self;
        
        
        //cantral 에 찾은 peripheral(주변기기 safety) 연결 시켜준다.
        //기기에 연결이 되었는지 확인은 바로 아래 델리게이트 메소드(didConnectPeripheral) 호출 결과를 통해 알 수 있다.
        [_centralManager connectPeripheral:_safetyPeripheral options:nil];
        
    }
    
    
}

//central에 특정 블루투스 기기가 연결이 되었는지 확인하는 델리게이트 함수.
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
    
    NSLog(@"Safety 기기 연결 성공 ! - 연결된 기기");
    
    //왼쪽 상단 이미지 변경 -> on 이미지
    [_bleOnOffImage setImage:[UIImage imageNamed:@"bt_on.png"]];
    
    //중앙 상단 텍스트 변경.
    [_bleModeStateText setText:@"블루투스(BLE) 연결 완료"];
    
    //주변 장치의 서비스 검색 - 결과를 확인하려면 델리게이트 메소드(peripheral : didDiscoverServices) 작성필요.(CBPeripheralDelegate 프로토콜 구현)
    [_safetyPeripheral discoverServices:@[ [CBUUID UUIDWithString:SAFETY_BLE_SERVICE]]];    //특정 serivce uuid 입력!

}


//주변기기가 제공하는 서비스 확인
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
    
    //오류가 있다면
    if (error != NULL) {
        NSLog(@"discoverServices 에러 발생! : peripheral: %@, error: %@",peripheral.name,error.debugDescription);
    }else{
        
        //서비스를 제공하는 주변기기 맴버 변수에 할당
        _safetyPeripheral = peripheral;
        
        for (int i=0; i < peripheral.services.count; i++) {
            CBService *service = [peripheral.services objectAtIndex:i];
            NSLog(@"찾은 서비스 아이디 : %@" , service.UUID.UUIDString);
            NSLog(@"찾은 서비스 설명 : %@" , service.debugDescription);
            
            //찾은 서비스의 id가 특정 service 아이디와 같으면
            if([service.UUID.UUIDString isEqualToString:SAFETY_BLE_SERVICE]){
                //서비스 id로 특성을 찾는다
                [peripheral discoverCharacteristics:@[ [CBUUID UUIDWithString:SAFETY_BLE_CHARACTERISTIC]] forService:service];
            }
        }
    }
}

//주변기기 특성 발견 델리게이트 메소드 + 구독
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{
    
    for (int i = 0; i < service.characteristics.count; i++) {
        
        //특성 가져오기
       CBCharacteristic *character = service.characteristics[i];
        
        NSLog(@"제공 가능 특성 UUID : %@" ,character.UUID.UUIDString);
        NSLog(@"제공 가능 특성 properties : %lu" ,(unsigned long)character.properties);
        NSLog(@"제공 가능 특성 character : %@" ,character);
        NSLog(@"\n");
        
        _safetyPeripheral = peripheral;
        _safetyPeripheral.delegate = self;
        
        //아래 메소드를 통해서 특성을 구독할 수 있다.
        //기기가 가진 특성의 noti값을 YES로 변경을 요청하면, 값이 변경된다면 데이터가 될때 자동으로 Central 쪽으로 데이터를 전송한다.
        //데이터를 보내는 용도로만 사용하는 특성은 구독을 해도 상태값이 변경되지 않도록 막혀 있다.
        [_safetyPeripheral setNotifyValue:YES forCharacteristic:character];
       
    }
}

//noti를 변경하려고 하면 호출되는 메소드
//주변기기 알림상태가 변경되었을때
- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{

    if (error) {
        NSLog(@"오류 발생 notification state: %@", error.localizedDescription);
    }else{
        
        //특성의 노티가 yes 면
        if (characteristic.isNotifying) {
            //정보를 받아오는 케릭터
            NSLog(@"Notification began on %@", characteristic);
            //_stateLabel.text = @"Notification began";
        } else {
            //정보를 던져야 하는 캐릭터
            NSLog(@"Notification finish on %@", characteristic);
            _characteristic = characteristic;
        };
        
    }

}


//주변기기가 던저 주는 데이터 받기 (0x01, 0x02)
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
    if (error) {
        NSLog(@"Error reading characteristics: %@", [error localizedDescription]);
        return;
    }

    if (characteristic.value != nil) {
        NSLog(@"characteristic.value : %@" ,characteristic.value);  //0x01(일반), 0x02(침수상태) 날라온다.
       
        NSLog(@"characteristic.value.description : %@" ,characteristic.value.description);
        
        NSString *peripheralSendSign = characteristic.value.description;
        
        if([peripheralSendSign containsString:@"0x02"]){
            NSLog(@"침수상황 sos!!");
            
            //긴급신고 화면 호출
            [self showSOSViewController];
            
            //주변기기가 던저 주는 데이터 종료 시키기 -
            
        }else if([peripheralSendSign containsString:@"0x01"]){
            NSLog(@"연결상황");
            
        }
        
    }
}




//주변기기 연결을 위한 상태 ON OFF 버튼
- (IBAction)scanBluetoothButton:(id)sender {
    
    //끄기(off) 이미지
    UIImage *btnOffImage = [UIImage imageNamed:@"icon_off.png"];
    //켜기(on) 이미지
    UIImage *btnOnImage = [UIImage imageNamed:@"icon_on.png"];
    
    
    //꺼져있으면
    if (_BleOnOffCheck == NO) {
        [_bleOnOffButton setImage:btnOnImage forState:UIControlStateNormal];
        _BleOnOffCheck = YES; //켬
        //센트럴 매니저 초기화 - > 스캔 시작
        [self initCentralManager];
        
        //정중앙 ble 이미지 연속 변경 로직
        _imagesList = @[@"siren_off_01.png", @"siren_off_02.png", @"siren_off_03.png", @"siren_off_04.png"];
        //타이머 시작
        _imageTimer = [NSTimer scheduledTimerWithTimeInterval:0.50
                                                       target:self
                                                       selector:@selector(changeImage)
                                                       userInfo:nil
                                                       repeats:YES];
      
    //켜져있으면
    }else if (_BleOnOffCheck == YES){
        
        [_bleOnOffButton setImage:btnOffImage forState:UIControlStateNormal];
        _BleOnOffCheck = NO; //끔
        //스캔 정지
        [_centralManager stopScan];
        //타이머 정지
        [_imageTimer invalidate];
        //센터 이미지 변경
        _bleCenterImage.image = [UIImage imageNamed:@"siren_off.png"];
        //좌측 상단 이미지 변경
        [_bleOnOffImage setImage:[UIImage imageNamed:@"bt_off.png"]];
        //중앙 상단 텍스트 변경.
        [_bleModeStateText setText:@"블루투스(BLE) 상태 확인중..."];
    }
}

//정중앙 이미지 변경
- (void)changeImage
{
  static int counter = 0;
  if([_imagesList count] == counter+1)
  {
      counter = 0;
  }
  _bleCenterImage.image = [UIImage imageNamed:[_imagesList objectAtIndex:counter]];

  counter++;
}



//취소 - 블루투스 기기 종료 시키기
- (IBAction)cancelButton:(UIButton *)sender {
    NSLog(@"취소 버튼이 눌렀습니다.");
    
    NSNumber *cancelNumber = [[NSNumber alloc]initWithInt:99];
    NSData *cancelData =  [NSData dataWithBytes:&cancelNumber length:1];
    
    //주변기기를 종료 시키기
    [_safetyPeripheral writeValue:cancelData forCharacteristic:_characteristic type:CBCharacteristicWriteWithoutResponse];
    
}


//물 속에 블루투스 기기가 입수되었을때, 긴급구조 화면 호출
-(void)showSOSViewController{
    
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    SosRequestViewController *sosVC = [storyboard instantiateViewControllerWithIdentifier:@"sosView"];
    [self presentViewController:sosVC animated:YES completion:^{
        NSLog(@"부모가 뷰컨트롤러를 뛰웠습니다.(완료)");
    }];
}


-(void)colorWord {
    NSMutableAttributedString * string = [[NSMutableAttributedString alloc]initWithString:_warningLabel.text];

    NSArray *words=[_warningLabel.text componentsSeparatedByString:@" "];

    for (NSString *word in words) {
        if ([word hasPrefix:@"허위 및 장난"]) {
            NSRange range=[_warningLabel.text rangeOfString:word];
            [string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range];
        }
    }
    [_warningLabel setAttributedText:string];
}





- (IBAction)segueTest:(id)sender {
    [self showSOSViewController];
    
}


@end



 
 



 

파일

BLETest 3.zip
5.73MB
DJAlertView-master.zip
0.07MB

+ Recent posts