55,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결야곰의 iOS 프로그래밍
강좌소개의 overview
강좌소개의 overview가 어디에 있나요?
- 미해결야곰의 iOS 프로그래밍
configure 메소드의 DispatchQueue.main
디스패치큐와 메인스레드에 대해 질문이 있습니다 🥲 Request.swift image 메소드 구현부에서 DispatchQueue.main.async { completion(image) }로 메인스레드에서 클로저를 실행하도록 만들어주었었는데 FriendTableViewCell.swift configure 메소드 내부의Request.image 메소드 호출부를 보면 completion 클로저에서도 또 메인스레드를 부르게 되어있어서 아래처럼 같은 일(메인스레드 부르는 일)을 중복으로 하게 되는 게 아닌지 궁금합니다! 제가 이해한 게 맞다면 이렇게 만들어주어야 하는 이유가 있을까요? DispatchQueue.main.async { DispatchQueue.main.async { guard let cell: FriendTableViewCell = tableView.cellForRow(at: indexPath) as? FriendTableViewCell else { return } cell.profileImageView.image = image } }
- 미해결야곰의 iOS 프로그래밍
prepareForReuse 사용 방법
안녕하세요, 찾아보니 말씀해주신 것처럼 셀을 초기화하는 메소드가 UITableViewCell의 prepareForReuse()인 것 같은데, UITableViewController를 상속받은 이 클래스 안에서 prepareForReuse 메소드를 사용할 수 있는 방법이 있나요? 상속부에 UITableViewCell을 추가하려 하니 클래스에 다중상속이 불가능하다는 오류가 떠서, 이 상황에서는 셀을 어떻게 초기화해주어야 하는 건지 궁금합니다.
- 미해결야곰의 iOS 프로그래밍
화면이 야곰님처럼 로드되지 않아 질문드립니다.
안녕하세요. 이번 강의 4분 부분까지 코드 작성해서 시뮬레이터 돌려봤는데 화면이 야곰님처럼 나오지가 않아서 질문 드립니다. https://drive.google.com/file/d/1p2cu_FJyIHfHfnmidca4x2MQHUZIMpJx/view?usp=sharing 코드 압축한 파일이구요. 여기서 테스트 1을 누르면 이렇게 제목과 내용이 전혀 뜨지 않고, datePicker 모양도 다르게 나오는 것 같습니다. Edit 버튼도 보이지 않습니다. 모달창을 내리면 테스트1 클릭 당시처럼 테스트1이 계속 회색으로 유지되고 있는데 이것도 왜 그런 것인지 모르겠습니다. ㅠㅠ 공유해주신 코드블럭 그대로 복붙한 것이라 코드는 정확히 작성했다고 생각하는데 강의 촬영 당시와 버전이 달라져서 생기는 문제인지, 코드를 어떻게 바꿔주면 좋을지 궁금합니다.
- 해결됨야곰의 iOS 프로그래밍
버튼 이미지 크기가 조절이 안 되는데 어떤 부분을 조정해야 할까요?
야곰님이 하신 것처럼 버튼 크기를 줄이면 이미지도 같이 크기가 줄어들 것으로 생각했는데 저는 버튼 크기가 줄어도 이미지는 크기가 그대로입니다. 버튼에서 이미지가 넘쳐요 ㅠㅠ 뭐가 문제일까요?
- 미해결야곰의 iOS 프로그래밍
코드블록 10-3-5 에러
switch PHPhotoLibrary.authorizationStatus() { 해당 라인에 에러메시지 "switch must be exhaustive" 어떻게 수정해야 하나요??
- 미해결야곰의 iOS 프로그래밍
info에서 자동완성이 나오지 않는데 따로 설정을 해주어야 하는 부분인가요?
제곧내
- 미해결야곰의 iOS 프로그래밍
star buton
xcode 버전 13.2.1 11:03 - button 추가 State Config 는 어디에 있나요???
- 미해결야곰의 iOS 프로그래밍
Singleton 관련 질문.
Singleton에서는 멤버 변수에 직접 값을 넣어야하나요? 제가 알기로는 set/get 함수를 사용하여 넣어야 한다고 알고 있는데 Singleton에서는 어떤 차이로 넣는지 알고싶어요.
- 미해결야곰의 iOS 프로그래밍
로컬 유저 노티피케이션에서 반복 주기 설정 방법 문의 드립니다.
안녕하세요? 유저노티피케이션에서 기능 구현을 하다가 며칠째 답을 못 찾아서 결국 문의 드립니다... 아이폰의 기본 앱인 "미리 알림" 앱처럼 시작 날짜와 사용자가 설정한 반복 주기 알람을 구현하려고 시도하고 있습니다. 매일, 매주, 매달, 매분기, 매년은 아래 개발자 문서대로 이용하면 될 것 같은데 ---------------------- Listing 1 creates a trigger that delivers its notification every morning at 8:30. The repeating behavior is achieved by specifying true for the repeats parameter when creating the trigger. Listing 1 Creating a trigger that repeats at a specific time var date = DateComponents()date.hour = 8date.minute = 30 let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true) ---------------------- "미리 알림" 앱의 사용자 설정 반복에서처럼 특정 날짜를 시작으로 2일마다, 5주마다, 6달, 3년마다 등 원하는 주기로 노티를 뜨게 하는 방법을 전혀 모르겠네요. TimeInterval Notification도 아래 처럼 시작 날짜가 무조건 현재인 듯 하고 도저히 구현 방안을 모르겠습니다. -------------- Listing 1 Creating a trigger that fires in 30 minutes // Fire in 30 minutes (60 seconds times 30)let trigger = UNTimeIntervalNotificationTrigger(timeInterval: (30*60), repeats: false) -------------- iOS 10 이전에는 UILocalNotification()에서 fireDate과 repeatInterval을 사용하였다는 내용은 찾았는데 UILocalNotification이 폐기된 후에는 같은 기능을 도저히 못 찾겠어서 질문 드립니다. 감사합니다.
- 미해결야곰의 iOS 프로그래밍
Todo 앱에서 로컬 노티피케이션 해제 시 질문 드립니다.
안녕하세요? 오랜만에 질문 드립니다.(또 귀찮게 해드리네요 ㅠ) 잠깐 두어달간 업무가 바빠져서 iOS 공부를 손에 놓았다가 다시 시작했습니다. 질문 드릴 것은 Todo에서 로컬 노티피케이션(알림 받기)을 설정하고 저장하면 노티피케이션 request가 등록되거나 해제되는데 처음 작성하는 Todo에서 처음부터 알림 받기를 off하여 저장하면 즉, shouldNotify가 처음부터 false인 경우 let isSuccess: Bool = Todo.saveToJSONFile() if isSuccess { if self.shouldNotify { Todo.addNotification(todo: self) } else { Todo.removeNotification(todo: self) } 이 코드에서 removeNotification은 해제할 노티피케이션이 없는데도 괜찮을런지 궁금합니다. (시뮬레이터에서 앱 실행은 문제가 없는데 나중에라도 크래쉬가 날까봐 무섭네요.) 혹시 해제 전에 노티피케이션이 등록되어 있는지 확인하는 로직이 필요할까요? 아니면 iOS에서 원래 등록되지 않은 노티피케이션이면 일치하는 identifier가 없으니 해제하라는 명령을 알아서 무시할 수도 있을 것 같기도 한데... 로컬 노티피케이션을 이것저것 응용해서 간단한 앱을 만들어 보고 있는데 개발자 문서에도 없는 request에 대해 해제하려고 할 때에 대해서는 나와 있지가 않아서 혹여나 하는 마음에 질문 드립니다. 감사합니다.
- 미해결야곰의 iOS 프로그래밍
ios13이 생기고 변경점 관련
[2:54] UserDefaults 사용하여 마지막 주소 저장 관련. ios 13이 생기고 scene delegate가 생겼는데 1. 그럼 저장(set) 할 때 SceneDelegate 폴더 -> ScneDelegate Class -> sceneWillResignActive메서드 안에 입력을 하는게 맞나요? 2. 읽어올 때 [3:45] didFinishLaunching... 에서 앱 실행할 때 저장된 값을 불러오는 것 같은데 ios13 이후 그대로 여기에 추가하는게 맞는 지 궁금합니다.
- 미해결야곰의 iOS 프로그래밍
8번 프로젝트
8번 프로젝트 중 테이블뷰 화면에서 navigationbar에 editbutton을 추가해서 버튼을 누르면 셀왼쪽에 빨간 그림이 나오는 부분은 어디서 동작하는건가요?
- 미해결야곰의 iOS 프로그래밍
todo 앱에서 파일 저장 기능에 대한 질문입니다.
안녕하세요? 자꾸 귀찮게 질문 드려 죄송합니다만... todo앱에서 또 질문이 있습니다 ㅠㅠ 아래 Todo 어레이를 JSON 파일로 저장하는 코드 및 save func 코드에 대한 질문입니다. /// 현재 Todo 배열 상태를 JSON 파일로 저장 @discardableResult private static func saveToJSONFile() -> Bool { do { let data: Data = try JSONEncoder().encode(self.all) try data.write(to: self.todosPathURL, options: Data.WritingOptions.atomicWrite) return true } catch { print(error.localizedDescription) } return false } Todo를 추가/수정하거나 삭제할 때 FileManager의 url path에 todos.jason 파일을 만들고 파일 유무를 확인한 다음에 그 파일에 json으로 인코딩 후 write를 하고, Todo를 추가/수정/삭제할 때마다 매번 임시 파일에 잠깐 썼다가 기존 todos.json을 파일 통째로 다시 덮어 쓰는 것(파일에 이어쓰기가 아닌)으로 이해했는데 맞을까요? 혹시 제가 이해한 게 맞다면 실제 상용 앱에서는 Todo 데이터의 수정(Create, Update, Delete)이 발생할 때마다 파일 전체 덮어쓰기 및 그 disk I/O 지연으로 인해 앱 성능이나 기기 수명에 영향이 없을지, 영향이 있다면 그와 같은 이유로 앱 스토어 심사에서 등록이 거부되지는 않을까 궁금합니다. 추후 확장성 고려 시 빈번하게 데이터 추가/수정/삭제가 일어나면 FileManager를 더 공부해서 기존 todos.json 파일을 이어쓰게 하는 게 좋을까요?(iOS에서 지원하는지는 모르겠습니다만) 아니면 CoreData 같은 것을 쓰는 게 좋을까요?(배우기 어렵다던데… ㅠ) 감사합니다.
- 미해결야곰의 iOS 프로그래밍
todo앱 User Notification에서 질문이 있습니다
안녕하세요? todo앱을 new project를 열어서 강의를 따라하다 보니 AppDelegate에서 막혔습니다. if let navigationController: UINavigationController = self.window?.rootViewController as? UINavigationController, 구문에서 Type of expression is ambiguous without more context라는 에러가 떠서 이런저런 검색을 해보니 iOS 13부터인가 window에 대한 선언이 SceneDelegate.swift에 있다고 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {} 에서 window를 통해 rootViewController를 지정할 수 있다고 알게 되었습니다. 그런데 또 어떤 글은 앱이 완전히 구동하기 전에 User Notification Delegate 설정을 해줘야 한다고 AppDelegate.swift의 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {} 에서 delegate 설정을 완료해야 한다고 되어 있어서요. [질문 1] UNUserNotificationCenter.current().delegate = todosTableViewController 구문을 어디에 작성해야 되는지 궁금합니다. SceneDelegate에 있는 var window: UIWindow?를 AppDelegate에 선언을 해서 해결해도 될까요? [질문 2] 또한 UNUserNotification의 delegate는 앱에서 하나만 존재해야 하고 존재할 수 밖에 없는지요? todo앱에서 배운대로 조금씩 변경해 보고 있는데요. todosViewController에서와는 다른 유저 알림을 추가로 구현하고 싶다면 UNUserNotificationCenter.current().delegate = myViewController 이런 식으로 delegate를 해야 할 거 같은데 설정해야 위치가 AppDelegate 또는 SceneDelegate에서 설정해야 한다고 하니 UNUserNotificationCenter.current().delegate는 객체가 아니라 타입 프로퍼티(표현이 맞는 건지 모르겠네요)라서 앱별로 하나만 구현할 수 밖에 없는 건지도 궁금합니다. 강사님 강의 듣고 궁금한 것은 알려주신대로 도큐먼트랑 인터넷 검색해서 찾아보고 있는데 위에서 질문드린 부분들은 잘 못 찾겠어서 질문 드립니다.
- 해결됨야곰의 iOS 프로그래밍
9번 프로젝트 질문
예제 함께하기 - 친구목록 테이블뷰 코드작성 // MARK: - Button States extension FriendViewController { private func correctBarButtonState() { self.navigationItem.rightBarButtonItems = nil let rightBarButtonItem: UIBarButtonItem if Person.bestFriends.contains(self.friend) { rightBarButtonItem = self.fullStarButton } else { rightBarButtonItem = self.emptyStarButton } self.navigationItem.rightBarButtonItems = [rightBarButtonItem] } } 셀을 클릭하여 친구정보를 확인하고나서, 별 버튼을 눌렀을 때 오류가 발생합니다. 오류 위치는 rightBarButtonItem = self.fullStarButton 입니다. self.fullStarButton 이 nil 이더라구요. // MARK: Stored Properties var friend: Person! { didSet { self.navigationItem.title = friend.name.first.uppercased() self.correctBarButtonState() } } 위 코드에 의해서 self.correctBarButtonState() 가 호출될때는 self.fullStarButton 이 nil 이 아닌데, 왜 별 버튼 클릭 시 호출될때는 nil 로 바뀌었는지 이해야되지 않습니다. 위 코드만으로 파악해주실 수 있으실까요? ps. viewWillAppear() 에서도 self.fullStarButton 이 nil 입니다 또 이해가 안가는건 if Person.bestFriends.contains(self.friend) { rightBarButtonItem = self.fullStarButton } else { rightBarButtonItem = self.fullStarButton } 위처럼 둘다 self.fullStarButton 으로 설정해버리면 오류 발생없고 nil 이 아닙니다;;이해가 어렵습니다 ㅠㅠ
- 해결됨야곰의 iOS 프로그래밍
9번 프로젝트 자료 질문
section9_files 폴더 안에 pdf파일과 code_block 파일 뿐입니다. 에셋 자료가 확인이 안되는 것 같습니다.
- 미해결야곰의 iOS 프로그래밍
8번 프로젝트 > 도전과제 2번 질문
데이터 형식을 json에서 property list 로 전환하는 부분에서 [저장]이 잘 안되고 있습니다. 저장을 했을 때, 아래의 saveToPlistFile 에서 별다른 에러없이 동작을 마칩니다. 해당 메소드에 진입하는 것까지 확인했습니다. (읽어와서 테이블뷰와 보기모드에는 잘 표현됩니다.) 혹시 아래 정보만으로 원인을 파악해주실 수 있을까요? Todos.plist extension Todo { static var all: [Todo] = Todo.loadTodosFromPlistFile() /// Todo JSON 파일 위치 private static var todosPathURL: URL { return try! FileManager.default.url(for: FileManager.SearchPathDirectory.applicationSupportDirectory, in: FileManager.SearchPathDomainMask.userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("todos.plist") } /// Todo plist 읽어오기 private static func loadTodosFromPlistFile() -> [Todo] { guard let asset: NSDataAsset = NSDataAsset(name: "Todos") else { print("에셋 로드 실패") return [] } do { let decoder: PropertyListDecoder = PropertyListDecoder() return try decoder.decode([Todo].self, from: asset.data) } catch { print("데이터 디코딩 실패") print(error.localizedDescription) return [] } } /// 현재 Todo 배열 상태를 plist에 저장 @discardableResult private static func saveToPlistFile() -> Bool { do { let encoder: PropertyListEncoder = PropertyListEncoder() let data: Data = try encoder.encode(self.all) try data.write(to: todosPathURL) return true } catch { print("Property List 저장 실패") print(error.localizedDescription) return false } } }
- 미해결야곰의 iOS 프로그래밍
Todo 앱에서 일정 추가가 바로 반영되지 않습니다.
Todo 앱에서 '+' 버튼을 누르고 일정을 입력하고 'Done'을 입력하고 목록화면을 보면, 바로 반영이 안되고 앱을 껐다가 다시 들어가면 입력했던 일정이 반영됩니다. 왜 입력을 하자마자는 반영이 안되는걸까요?? 제대로 다 따라했다고 생각하는데 일정 삭제 기능과 일정 순서 바꾸기 기능을 제가 따로 추가했는데, 그 때문의 이유는 아닌 것 같습니다 ㅠㅠ
- 미해결야곰의 iOS 프로그래밍
Todo 앱에서 DateFormatter 사용 관련 질문 드립니다.
Todo 앱에서 DateFormatter 사용 관련 질문 드립니다. 질문이 3개 있습니다. 질문 1. private let dateFormatter: DateFormatter = { let formatter: DateFormatter = DateFormatter() formatter.dateStyle = DateFormatter.Style.medium formatter.timeStyle = DateFormatter.Style.short return formatter }() 에서 = 뒤의 {}() 코드 블록을 어떻게 이해하면 될까요? 강사님 말씀대로 이름 없는 함수인 클로져로 이해해 보려고 해도 아닌 것 같고 연산 프로퍼티의 게터도 아닌 거 같고… 대략적으로 {}의 코드가 DateFormatter 객체를 생성해서 반환하는 거 같은데 어떤 스위프트 문법에 의해서 가능한 건지 모르겠습니다. 질문 2. 여러 스위프트 코드를 보면 DateFormatter처럼 클래스 객체를 생성할 때 ClassName() 이런 식으로 생성하는 경우가 있던데 이런 기존 library 객체들의 디폴트 생성자를 찾아보려면 관련 문서는 어떻게 검색할 수 있을까요? 올려주신 학습자료랑 스위프트 개발자 문서를 봐도 이런 내용은 잘 못 찾겠어서 방법을 문의 드립니다. 자바 같은 경우에는 도큐먼트에 디폴트 생성자가 설명되어 있었던 거 같은데 비슷한 도큐먼트를 어떻게 찾는지 궁금합니다. 질문 3. 위 코드를 이해하려고 이것저것 바꿔보다가 private let dateFormatter: DateFormatter = { let formatter: DateFormatter = DateFormatter() formatter.dateStyle = DateFormatter.Style.medium formatter.timeStyle = DateFormatter.Style.short return formatter }() 를 아래처럼 바꿔 보았습니다. private let dateFormatter: DateFormatter = DateFormatter() dateFormatter.dateStyle = DateFormatter.Style.medium dateFormatter.timeStyle = DateFormatter.Style.short 그랬더니 두번째 줄에서 Consecutive declarations on a line must be separated by ; 라는 에러가 나더라고요 let을 var로도 고쳐봐도 똑같고… 스위프트의 클래스에서는 프로퍼티(dateFormatter)에 어떤 타입의 객체를 생성 할당 후 그 객체의 프로퍼티(dateFormatter.dateStyle)는 바로 세팅을 못 해주는 건가요? 그럼 강사님이 작성하신 코드처럼 밖에는 작성을 못 하는 건지 아니면 UITableViewController의 init()을 써야 되는 건지도 궁금합니다. 긴 질문 읽어주셔서 감사합니다. 답변 미리 감사 드립니다.