iOS 55

iOS15/ Xcode13 에서 체크박스 만들기...실패와 해결

iOS 에서는 기본적으로 제공해주는 체크박스가 없다. 위처럼 자동로그인 버튼을 체크했을 때 체크박스처럼 색깔이 채워지는 기능을 만들고 싶었다. 그래서!! 원래는 속이 비어있는 체크박스의 이미지를 가지고 있다가 터치되면 속이 차있는 이미지를 바꾸는 방식으로 구현하기로 하였다. 이미지는 SF Symbol의 checkmark.rectangle과 checkmark.rectangle.fill을 사용하였다! 버튼의 이미지를 바꾸는 작업은 간단하다. 단순히 버튼에 setImage 메서드를 사용하면되기 때문이다. 비어있는 체크박스는 버튼의 ControlState가 normal일때, 색칠되어있는 체크박스는 버튼의 ControlState가 selected일 때로 설정하고, 버튼이 눌릴 때마다 버튼의 isSelected 프..

iOS/StoryBoard 2022.02.18

조건문을 이용해서 백그라운드 색상 변경하기

구현하고자 하는 기능은 위와 같이 로그인 버튼을 눌렀을 때 메인화면으로 이동하고, 버튼을 눌러서 배경색을 변경시키는 것이다. 주요 기능은 조건문을 이용해서 색상을 변경시키는 것이지만, ViewController를 직접 코드로만 작성해보고, Label과 Button을 추가시키는 것까지 함께 해보자 먼저 화면 충앙에 "메인 화면"을 추가하고 중앙에 위치시켜보자. var titleLabel: UILabel = { let label = UILabel() label.text = "메인화면" label.textAlignment = .center label.font = UIFont.boldSystemFont(ofSize: 50) label.textColor = .white return label }() label의 ..

iOS/StoryBoard 2022.02.17

iOS 앱에서 QR코드 인식시키기

QR코드란 하나의 URL이다. URL로 만들어진 QR코드를 다음과 같은 과정으로 인식하게된다. 1. 사진을 찍어서 QR코드를 인식시킨다. 2. QR코드를 URL주소로 만든다. 3. URL주소를 웹뷰로 보여준다. QR코드 인식 버튼을 클리갛게 되면, QR코드 뷰 컨트롤러를 이용해서 사진을 찍게 되면, 인식된 URL로 웹뷰를 띄우는 방식으로 진행할 것이다. QR코드 리더는 다음과 같은 오픈소스를 사용한다. GitHub - yannickl/QRCodeReader.swift: Simple QRCode reader in Swift Simple QRCode reader in Swift. Contribute to yannickl/QRCodeReader.swift development by creating an acc..

iOS/StoryBoard 2022.02.15

UITableViewCell을 SwipeCellKit.SwipeTableViewCell로 바꾸기

UITableViewCell의 Cell을 밀어서 삭제하는 기능을 추가하기 위해서 SwipeCellKit을 처음 사용하게 되고, 메뉴얼에 따라 메서드를 추가하고 앱을 실행시키면 Xcode에서 다음과 같은 에러를 발생시키면 앱이 Crush된다. Could not cast value of type 'UITableViewCell' (0x1d82c22f8) to 'SwipeCellKit.SwipeTableViewCell' (0x10350ed50). 이를 해결하는 방법은 앱을 중지한 후 Main.storyboard로 가서 우리가 SwipeCell로 사용한 Cell을 선택한 다음 Identity Inspector에tj 서 클래스(Class)와 그 클래스가 있는 모듈(Module)을 지정해주면 된다. 여기서는 Clas..

iOS/StoryBoard 2022.02.09

'the realm is already in a write transaction' 에러

이미 realm write에 들어가 있는 쓰레드에서 다시 write를 수행하려고 할 때 발생하는 에러이다. let action = UIAlertAction(title: "Add Item", style: .default) { action in if let currentCategory = self.selectedCategory { do { try self.realm.write { let newItem = Item() newItem.title = textField.text! newItem.dateCreated = Date() // make current date currentCategory.items.append(newItem) self.saveItem(item: newItem) // 문제발생 } } catc..

iOS/Errors 2022.02.08

Realm의 Read, Update, Delete

Read Core Data를 사용할 때는 NSFetchRequest를 만들어내고, request변수에 우리가 원하는 조건을 추가하고, 콘텍스트(context)의 fetch()메서드를 사용해서 데이터를 읽어 올 수 있었다. 하지만 Realm을 사용하면 단 한줄만으로 데이터를 읽어올 수 있다. Category라는 데이터를 읽어와 변수에 저장하기 위해서는 let categories = realm.objects(Category.self) Category에 해당하는 모든 데이터를 읽어와 categories에 저장해준다. 하지만 우리는 Category객체의 배열에 데이터를 답고 싶고, realm.object(Category.self) 가 반환하는 값은 Result타입이다. Result는 Realm Swfit에서 정..

Realm 소개

Realm은 Core data보다 적고 간단한 코드를 사용하면서 데이터를 조작할 수 있는 프레임워크이다. 해당 사이트에 가면, Realm 튜토리얼과 공식문서를 볼 수 있다. Realm Home Build better apps, faster realm.io 프로젝트 폴더 내부에 Podfile을 만들어, Realm 패키지를 프로젝트에 포함시킨다. platform :ios, '9.0' target 'Todoey' do use_frameworks! # Pods for Todoey pod 'RealmSwift' end 프로젝트에 Realm 을 이용해 영구 데이터(persistent data)를 사용하기 위해 AppDelegate.swift에 우리가 앞으로 사용할 realm 저장소 변수를 추가할 수 있다. Data..

CoreData를 이용해서 카테고리 계획 앱 만들기

Todoey목록에서 카테고리를 등록하고, 각 카테고리마다 Item들을 저장하는 앱을 만들어보자. Item에 대한 내용은 이전에 설명하였기 때문에, 이번에는 Category뷰를 만들어보면서 이전에 살펴보았던 내용을 함께 살펴보고, 두 개의 데이터를 one to many나 many to one의 관계로 연결하고, 관계(Relation)의 이름을 통해 관계를 가지는 데이터를 어떻게 사용하는지 알아보자. 데이터 Relation만들기 먼저 Category라는 새로운 엔티티를 만들고, Item엔티티와 관계(Relation)를 만들어준다. control(⌃)을 누른 채로 마우스 드래그하면, 관계를 만들 수 있으며, 각 엔티티에서 관계를 어떻게 부를지 Relation의 이름도 설정할 수 있다. Category와 Ite..

UISearchBar를 사용해서 목록 검색하기

스토리보드 라이브러리에서 Search Bar를 선택해서 간단하게 검색창을 놓을 수 있다. 데이터는 Item이라는 이름의 entity이고, title과 done 이라는 프로퍼티가 엔티티에 지정되어 있다. 서치바의 기능을 사용하기 위해서는 클래스에 UISearchBarDelegate 클래스를 상속해야한다. Delegate가 포함된 클래스를 상속받을 때에는 항상 delegate를 지금 구현해야 하는 클래스로 바꾸어 주는 것을 잊지 말자. searchBar.delegate = self 위와 같이 코드로 작성해주거나, 아래와 같이 스토리 보드 파일에서 직점 설정해 줄 수 있다. control(⌃)을 누른 채로, 뷰 상단에 가져다 대면 delegate로 설정할 수 있다. //MARK: - Search bar met..

iOS/StoryBoard 2022.02.01

Core Data: Read, Update, Delete

Read func loadItems() { let request: NSFetchRequest = Item.fetchRequest() do { itemArray = try context.fetch(request) } catch { print("Error fetching data from context \(error)") } } viewDidLoad() 메서드에 위와 같은 함수를 호출하여, 앱 실행시 데이터를 불러오도록 하였다. itemArray 라는 배열에 데이터를 불러오면 화면에 출력해주는 방식이다. Item은 우리가 만든 엔티티의 이름이다. request를 받을 때는 NSFetchRequest으로 타입을 꼭 특정해주어야 한다. 그리고 context.fetch(_:)메서드를 통해서 데이터베이스에 있는 데..