목록개발/iOS (22)
Stacking Fire
(이 포스팅은 StackOverFlow의 이 답변의 아이디어를 기반으로 간단한 수정만을 거쳤음을 알립니다.) iOS에서 로컬라이제이션을 하려면 아래와 같은 코드를 사용합니다. myLabel.text = Bundle.main.localizedString(forKey: "쓰고자 하는 글", value: nil, table: nil) 스트링이 들어가는 모든 부분에 말이죠. 한두번도 아니고 말그대로 수십번 이렇게 쓰는 것은 쉬운 일이 아닙니다. 그래서, 이 똑같은 걸 간단하게 바꾸는 아이디어가 있기에 가져와 보았습니다. 그러니까 스트링이 들어가는 모든 부분에 필요한 거잖아요. 그럼 스트링한테 시키면 된다는 겁니다. extension String { var localized: String { return Bund..
개요 Crashlytics는 모바일 앱에서 발생한 크래시를 개발자가 알 수 있도록 해 주는 솔루션입니다. (언어 : Swift) 사용법 Fabric ID가 필요하며, iOS에 해당하는 라이브러리는 CocoaPods을 통해 설치합니다. Kit를 프로젝트에 추가하기 // Podfile pod 'Fabric' pod 'Crashlytics' // Run Script Build Phase "${PODS_ROOT}/Fabric/run" ##################API KEY################ // Info.plist Fabric APIKey ##################API KEY################ Kits KitInfo KitName Crashlytics Crashlytics ..
회사에서 새롭게 만드는 프로젝트의 중요 기능에 유닛 테스트를 적용하기 위해 방법을 정리해 보았다. 방법 테스트 타겟을 만들어 특정 함수가 기대하는 결과를 내는지를 검증. 순서 : 유닛 테스트 타겟 추가 → 테스트용 인스턴스 생성 → 결과 확인을 XCTest 함수에 연결 → ⌘ + U로 실행 테스트용 인스턴스 테스트용 인스턴스는 setUp()에서 만들고 tearDown()에서 풀어준다. setUp() 에서는 super.setUp()아래에 인스턴스를 만든다. tearDown()에서는 super.tearDown() 위에서 nil을 할당해 준다. var instanceForTesting: ClassForTesting! override func setUp() { super.setUp() instanceForTes..
결국 프로그래밍이라는 것은, 적절한 타이밍에 적절한 행동을 적절한 대상에게 시키는 일입니다. 그리고 iOS 앱이란 App 과 view로 이루어져 있기에, 그 각각의 생명 주기를 아는 것은 어떤 일을 어떻게 시키는지 아는 것만큼이나 중요합니다.아래는 간단히 2개의 뷰로 이루어진 테스트용 앱에서 각 라이프사이클 메서드에 로그를 찍은 결과입니다. awakeFromNib - 첫번째 뷰가 Nib에서 깨어났습니다. didFinishLaunchingWithOptions 앱이 옵션과 함께 런치되었습니다. --------------------------------------------------------------------- loadView - 첫 번째 뷰가 로드됩니다. viewDidLoad - 첫번째 뷰가 로드되었..
패스트캠퍼스에서 딜리게이트에 관련된 수업을 진행하던 도중, 텍스트필드의 글자수를 제한하는 것에 관련된 예제를 진행한 적이 있었습니다. 최초에 나온 답변에 대해서 다시 버그를 찾아내고, 그 버그를 픽스하고 하면서 Delegate에 대해서 알아볼 수 있는 굉장히 유익한 시간이었는데요. 해결하고자 하는 요건은 아래와 같았습니다. 입력되는 글자수가 10자를 넘지 않을 것. 입력시 커서가 텍스트 내에 어디에 있든 상관없이 작동할 것. 복사해온 스트링을 넣어도 알아서 거부할 것. 삭제도 문제없이 될 것. 단순히 잘 해결했다는 느낌을 떠나서, 딜리게이트의 구조를 정확히 알고 또 구현하고자 하는 상황의 의미를 그대로 코드로 자아낸 예제라서 기억에 많이 남습니다. 당시 배운 것들을 정리합니다. 풀이와 설명 결론부터 말하..
들어가면서 모바일에서 정보를 입력 받는 뷰의 경우... 안 그래도 좁은 화면에 키보드까지 덮여 있기 때문에 사용자가 불편함을 느껴 키보드를 내리려고 할 때가 많습니다. 키보드에 액세서리 뷰를 추가하는 방법도 있긴 하지만 잠깐 화면을 볼 때마다 뭔가 결정하는 듯한 뉘앙스를 주는 거 같아서, 그냥 화면 내에 인터랙션이 없는 곳을 탭해서 내리고 싶을 때가 있죠. 그럴 때 쉽게 적용할 수 있는 방식을 소개합니다! 1. UIViewController의 extension 만들기 extension UIViewController { func endEditingModeWhenUserTapOutside() { let tap = UITapGestureRecognizer(target: self, action: #selecto..
저는 UINavigationController를 좋아합니다. Cocoa Touch의 근간과 같은 컨트롤러죠. 이름부터도 iOS의 보편적인 Navigation을 책임지고 있습니다. 그러다보니 iPhone 사용자들은 UINavigationBar에 참 익숙한데요. 그러다 보니 딱히 UINavagationController의 기능이 필요없는 뷰에서도 UINavigationBar에 기능을 넣는 경우가 있습니다. 그런데 그냥 UINavigationBar만을 올리면, 네비게이션바와 스테이터스 바 사이가 붕 뜨는 문제가 있습니다.오늘은 이것을 해결하는 팁을 소개해 보겠습니다. 1. 우선 UINavigationBarDelegate를 연결해 줍니다. 2. ViewController에도 추가해 줍니다. class ViewC..
Realm을 이용해서 간단하게 주소록을 만들어 봤습니다.(Dependancy Manager는 Carthage를 사용했습니다. 설정법은 여기) 했던 예제 코드입니다 :) (2017. 7. 3. 14시에 수정하였습니다.) ScreenShots 구현부 1.Object 서브클래스 만들기 Realm을 프로젝트에 추가하면 자동으로 Object라는 클래스를 사용할 수 있게 됩니다. 굉장히 당당한 이름이네요... NSObject가 마치 외부 라이브러리처럼 보이게 하는 Realm의 위엄! import Realm import RealmSwift class Contact: Object { ///'dynamic var'로 프로퍼티를 설정해 줍니다. dynamic var personID: Int = 0 dynamic var n..
6월 28일, FastCampus에서 2기 기수강 개발자인 이봉원님(GiftBot)님의 특강이 진행되었습니다. 크게 두 가지 부분에 대해 강의 진행하셨는데요. 첫 번째가 CocoaPods 등 디펜던시 매니저 관련 활용법이고, 두 번째는 요즘이라기엔 뭐하고 계속 핫한 Realm에 대한 활용법이었습니다.두 가지 다 내용이 좋아서. 인상적인 것을 정리놓으려고 합니다. 카르타고? 카르타고는 이번에 처음 알게 된 디펜던시 매니저인데요. 코코아팟과 동일한 목적을 위해 사용하지만, 컴파일 타이밍이 다릅니다. 프로젝트에 코드로 추가하는 것이 아니라 컴파일된 바이너리를 등록해서 쓰는 방식인데요. 이 방식을 통해 수정사항이 발생할 리가 거의 없는 외부 라이브러리 컴파일을 내 프로젝트 수정할 때마다 매번 컴파일하는 비효율을..
2017년 WWDC에서 Cocoa Touch 프레임워크와 스위프트에 새롭게 추가된 것들을 이야기하는 세션인 "What's New In Cocoa Touch 2017"를 보고 나름대로 정리해 보았습니다. WWDC 세션 영상 1. Productivity Drag & Drop 이번 iOS 업데이트는 상당히 특이한 업데이트였는데요. iPhone에 대해서는 몇몇 UI 수정사항을 제외하고는 크게 사용성이 변화할 정도의 것은 없었던 데 반해, 아이패드는 완전히 새로운 기기로 만들어 버렸습니다. 그 중 하나가 단연 "File"이라는 앱과 "Drag & Drop" 기능이었습니다. 그것을 적용하는 방식을 소개하고 있었습니다. UIDragInteraction : 적용할 아이템에 넣어버리기. let drag = UIDragI..