요즘 노는 시간 도중도중 공부를 하고있는데

 

그 공부하고있는것중 ios용 키보드를 하나 만들고있다.

 

이곳에 쏟아 붇는시간이 얼마되지않아 진도가 많이 느리고 

 

처음에 제대로 공부하고 계획짜서 시작한게아니라 벌써 2번이나 갈아엎은 프로젝트이다.

 

기록을 살펴보니 최초일자가 5월19일

 

시작날짜만 보면 근 11일정도하고 영문키보드까진 됐는데

 

만들어야지 하고 이글 저글 스크랩만 해뒀던게 5월초부터니

 

근 한달간 공부는 키보드관련만 하고있었다

 

그렇게 근 한달정도된 프로젝트 진행 소스는 아래에 있다.

 

https://github.com/wiwi-git/FirstKeyboard

 

wiwi-git/FirstKeyboard

키보드 만들어보기... Contribute to wiwi-git/FirstKeyboard development by creating an account on GitHub.

github.com

키보드 디자인은 최대한 기본 키보드UI에서 벗어나질 않으려고 했고

 

기본 키보드를 쓰면서 제일 불편했던 숫자부분과 특수문자부분을 바로 입력가능하도록한 프로젝트였으나

 

여기까지 만들어놓고보니

 

한글을 입력하면!

 

자음, 모음이 하나씩 들어간다

 

합쳐지질 않는다

 

 

몰랐다.

 

 

새로운걸 알게되서 좋긴하나

 

어떻게 해야할지 모르겠다

 

조합하는거 자체는 어느 고마우신분이 c#으로 작성해둔게 있어서 Swift 소스로 바꿨는데

이걸 어떻게 입력이 들어가야할지 막막해져서 

 

원래는 완성되면 올리려고한 포스트를 진행상황과 자모 합하는 함수 저장용으로 이 포스트를 남긴다.

 

아래 주소는 네이버 닉 골드러쉬님이 c#으로 12년도에 작성한 포스트이다.

m.blog.naver.com/goldrushing/130145910594

 

[C#] 한글 자음/모음 조합하기.

참조: 데브피아 (http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEUL...

blog.naver.com

 

이걸 swift로 변환하면 이렇게된다.

 

let cho:[Character] = ["ㄱ","ㄲ","ㄴ","ㄷ","ㄸ","ㄹ","ㅁ","ㅂ","ㅃ","ㅅ","ㅆ","ㅇ","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"]

let jung:[Character] = ["ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", "ㅖ", "ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", "ㅜ", "ㅝ",
                        "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ"]
let jong:[Character] = [" ", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ", "ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ", "ㄿ",
                        "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"]
func hangle(c1:Character,c2:Character,c3:Character) -> Character? {
    var cho_i = 0
    var jung_i = 0
    var jong_i = 0
    for i in 0 ..< cho.count {
        if cho[i] == c1 { cho_i = i }
    }
    
    for i in 0 ..< jung.count {
        if jung[i] == c2 { jung_i = i }
    }
    
    for i in 0 ..< jong.count {
        if jong[i] == c3 { jong_i = i }
    }
    
    let uniValue:Int = (cho_i * 21 * 28) + (jung_i * 28) + (jong_i) + 0xAC00;
    if let uni = Unicode.Scalar(uniValue) {
        return Character(uni)
    }
    
    return nil
}

 

정확히 말하면 조금 변경했는데

변환이 안됐을때의 값을 nil값이 나오도록했고, 초성/중성/종성이 담긴 배열은 그냥 밖으로 빼버렸다.

 

분명 코드값 비교해가며 고민하신 소스일텐데 이렇게 공유해주시니 매우 감사할따름

 

 

아직도 왜 오류가 났는지 모르겠으나

테이블 생성시

id필드에 INTEGER PRIMARY KEY 그리고 AUTO_INCREMENT를 주었다.

 

결과...

생성이 되었는지 안되었는지 아마 안되었기에 뒤부분에서 계속 오류가 발생한거겠지

 

문서좀 뒤져보니 

PRIMARY KEY로 설정된애가 INTERGER일경우 자동으로 auto increment설정이 붙는다고한다

실제로 해당키워드를 지우고 돌려보니 무사히 돌아간다.

 

그리고 insert 문으로 데이터를 넣을시 id값도 무사히 잘 증가되어서 들어간다.

 

이전 그대로 소스를 돌려쓰고있는터라 

왜 이런문제가 발생했는지 아직도 모르겠다.

 

https://www.sqlite.org/autoinc.html

 

SQLite Autoincrement

1. Summary The AUTOINCREMENT keyword imposes extra CPU, memory, disk space, and disk I/O overhead and should be avoided if not strictly needed. It is usually not needed. In SQLite, a column with type INTEGER PRIMARY KEY is an alias for the ROWID (except in

www.sqlite.org

 

 

어느날 테스트를 하던도중 뭔지 잘모르겠으나

시뮬레이터상에서 화면전환 및 새로고쳐지는 애니메이션이 매우매우매우매우매우매우매우 느리게 보여진다.

뭔가 cpu사용량이 넘치는건가 싶어 다른시뮬레이터들을 전부끄고 하나만 돌려봐도 여전히 사태는 호전되지않는다

 

pc를 재부팅해도 이러한문제는 해결되지않았다.

 

검색도중 이러한글을 발견

https://stackoverflow.com/questions/35398356/how-to-speed-up-the-iphone-simulator-in-xcode/35398507#35398507?newreg=81dbb95772f34189b7f246555a57248e

 

How to speed up the iPhone simulator in Xcode

I'm using Xcode 7.2. When I build/run my app on device, all objects and images move according to the speed I set in the code, everything moves quickly. However, on iPhone simulator in Xcode, everyt...

stackoverflow.com

 

그러하다. 시뮬레이터의 디버그모드에서 

 

slow animation이라는 기능이 켜져있어서 생긴문제

 

아니 문제라기보단 그러한 기능

 

이러한기능이 있는지도 오늘처음알았다.

 

곧 퇴사일이 다가오는데 이러한 기본적인것도 모르고있으니 앞길이 막막하다

 

참고로 기능의 온오프는 아래 사진을 참고해라

 

'Could not instantiate class named _UITextLayoutView because no class named _UITextLayoutView was found;

라는 오류 메시지가 뜨면서 앱이 튕긴다.

 

https://stackoverflow.com/questions/58657087/after-upgrading-to-xcode-11-2-from-xcode-11-1-app-crashes-due-to-uitextlayoutv

 

After upgrading to Xcode 11.2 from Xcode 11.1, app crashes due to _UITextLayoutView

After upgrading to Xcode 11.2 from Xcode 11.1 app crashes: *** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named

stackoverflow.com

 

에서 해당 문제 상황에 대한 해결책이 제시되었다

 

import UIKit

@objc
class UITextViewWorkaround : NSObject {

    static func executeWorkaround() {
        if #available(iOS 13.2, *) {
        } else {
            let className = "_UITextLayoutView"
            let theClass = objc_getClass(className)
            if theClass == nil {
                let classPair: AnyClass? = objc_allocateClassPair(UIView.self, className, 0)
                objc_registerClassPair(classPair!)
            }
        }
    }

}

 

해당 클래스를 작성한후

 

Appdelegate 에 application( didFinishLaunchingWithOptions ) 항목에서 

executeWorkaround() 를 실행시켜주면 이상없이 동작한다!

 

추가로 xcode 업데이트로 해당문제는 해결될것으로 보인다.

우선은 추가...

모달형식을꽤나 자주 쓰는 앱인데 ( present() )

모달을 띄우면 기존엔 풀스크린으로 깔끔히 보이던게 ios13에서는 상단에 이상한 모양의 카드? 형식처럼 모달이 표시된다.

 

멘붕상태에 빠지고 구글신님께 문의를해보니

 

"""

iOS 13.0부터 iOS에서는 UIModalPresentationAutomatic이 기본값이고, 이전 버전에서는 UIModalPresentationFullScreen입니다.

기본적으로 UIViewController는 UIModalPresentationAutomatic을 UIModalPresentationPageSheet로 해석하지만 다른 시스템 제공보기 컨트롤러는 UIModalPresentationAutomatic을 다른 구체적인 프리젠 테이션 스타일로 해석 할 수 있습니다.

"""

라고한다.

 

그리하여.

.modalPresentationStyle 을 풀스크린으로 변경해주면 

ios13에서도 정상적으로 뜬다.

 

물론 이것만으로 모든게 정상적으로 돌아가는게 아니였다.......

 

이유는 모르겠지만 컨테이너뷰로 만든애의 옆구리가 빈다....................

 

너네 왜그러니 ㅠㅠ

 

참고로 옆구리가 비어있는 문제는 ios13 xr 시뮬레이터 이상에서만 나온다.

기존 타겟으로 삼은 기기 6s에선 ios13으로도 문제없이 프린트가 된다.

 

도대체 뭐가 문제였을까

ios12로 돌리던 xr에선 문제없이 보이건만 슬플따름

 

이거에대한 문제가 해결되면 나중에 다시 관련내용으로 글을 작성할 예정이다.

 

 

 

==========================================================================

추가

 

옆구리가 비는 문제는 몇몇의 기기에서만 발생하는문제였다.

임시적으로

viewWillLayoutSubviews 에서 크기와 위치를 재설정해줘서 땜빵해놨다.

이 이후에 문제가 뭔지 발견하면 수정할 예정.

이번 프로젝트에서는 데이터가 날짜에 대한 항목이 여러군데에서 많이 쓰여

기본 타입의 확장으로 편리성을 높여봤습니다.

 

날짜 형식을 잘 파싱해서 Datecomponents에 넣어서 Date값을 반환해도 좋지만

Dateformat을 활용해 바꿔봤습니다.

 

extension String {
    func toDate() -> Date? { //"yyyy-MM-dd HH:mm:ss"
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        dateFormatter.timeZone = TimeZone(identifier: "UTC")
        if let date = dateFormatter.date(from: self) {
            return date
        } else {
            return nil
        }
    }
}

extension Date {
    func toString() -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        dateFormatter.timeZone = TimeZone(identifier: "UTC")
        return dateFormatter.string(from: self)
    }
}

 

따로 함수로 빼서 사용 하시려면 self 자리에 해당하는 내용을 적어주면 되겠네요 ㅎ

추가로 toString할때 타임존을 UTC 가 아니라 각 나라별로 하면

Date는 기본이 UTC라 각 나라의 시간대별 시간으로 바로 변환 하는걸로 써먹을수도 있을거같아요.

혹은 날짜형식 변환에도 써먹을수 있겠네요

년 월 일 시 분 초 있는 문자열을 월/일 시 - 분 문자열로 변환같은 기능으로요.

 

그럴일이 있을까 모르겠습니다만...

 

아무튼 위 소스의  사용은 아래와 같이 해봤습니다.

(참고로 이 애들은 전역 변수 쓰듯이 클래스 밖에다가 적어 주셔야합니다 extension 사용임을 잊지말아주세요.)

 

참고로 toDate()는 반환이 옵셔녈 타입이기에 한번 옵셔널을 벗겨주셔야합니다.

현재 연결된 WiFi의 SSID값을 받아와서 내가 연결하려한SSID와 같은지 비교해서

앱내에서 연결이 됐는지 확인하는 예제를 만들고 있었으나,

func currentSSIDs() -> [String] {
    guard let interfaces = CNCopySupportedInterfaces() as? [String] else {
        return []
    }
    return interfaces.compactMap { interfaceName in
        guard let info = CNCopyCurrentNetworkInfo(interfaceName as CFString) as? [String:AnyObject] else {
        	print("Point 0")
            return nil
        }
        guard let ssid = info[kCNNetworkInfoKeySSID as String] as? String else {
        	print("Point 1")
            return nil
        }
        return ssid
    }
}

ps. 해당소스는 https://codeday.me/ko/qa/20190625/886103.html 를 보고 살짝 바꾼 코드이다.

(iOS11 이상부터?  단순 Nil값 제거는 flatMap 대신 compactMap 을 쓰는걸 권장하고있다)

 

currentSSIDs 의 값이 항상 nil이 나오고

console에 Point 0가 찍힌다.

 

처음에는 뭔가 키라던가 변경되어 값을 잘못 참조하고있는줄 알았다.

그렇게 키값 위주로 검색해보던중 우연찮게

잘못된곳은 그곳이 아니라는걸 알게되었고

문제는 아래 스택오버플로우의 글과 같았다.

 

https://stackoverflow.com/questions/50767946/systemconfiguration-captivenetwork-doesnt-work-on-ios-12 

 

테스트하고 있던 폰은 iOS12 로 WiFi 정보를 받아오려면

Project File -> Capabilities 의 Access WiFi Information 을 on으로 변경해줘야한다.

 

변경해주었더니 잘 받아옴....

+ Recent posts