본문 바로가기
728x90

iOS/iOS78

UINavigationViewController (with. Coordinator Pattern) 지저분한 viewController를 정리해보자 UINavigationController를 좀 더 관리하기 쉽고 재사용하기 쉽게하려면 Coordinator 패턴을 이용하면 된다. 한 곳에서 viewController들이 push되고 pop되는 등의 관리를 하고, 사용하는 곳에서는 관리클래스의 함수 하나만 호출해다 쓰면 된다. 기존의 방식은 let vc = self.storyboardinstantiateViewController(withIdentifier: "id") as! someViewController self.navigationController.pushViewController(vc, animated: true) 이렇게 매번 Avc가 Bvc를 알아야 했다. 이는 객체간 결합도가 높아지게 하는 방식.. 2023. 3. 2.
네이버 지도 API * 주의 사항 네이버 지도 API 사용시 메모리 해제가 되지 않는 문제가 있으니 주의 필요! 마커 위 정보창 기본 NMFInfoWindow *infoWindow = [NMFInfoWindow new]; NMFInfoWindowDefaultTextSource *dataSource = [NMFInfoWindowDefaultTextSource dataSource]; infoWindow.dataSource = dataSource; // 내가 생성해둔 마커 사용 NMFMarker * marker = [NMFMarker new]; if (marker.infoWindow == nil) { // infoWindow를 marker에 넣어 open [infoWindow openWithMarker:marker]; } els.. 2023. 2. 15.
keyboard 높이 텍스트필드나 텍스트뷰 같은 사용자의 입력이 필요한 컴포넌트 사용시 키보드를 이용해서 뷰의 높이 또는 위치를 조정 해주어야 할 때가 있다. NSNotificationCenter에 키보드 옵저버를 등록해주고, 옵저버의 selector 함수에서 파라미터로 NSNotification을 설정해주면 userInfo를 통해 키보드의 높이 값을 얻을 수 있는데 이때 사용되는 key에 따라 값을 다르게 얻을 수 있다. UIKeyboardFrameEndUserInfoKey vs. UIKeyboardFrameBeginUserInfoKey 둘 다 키보드의 높이를 받아오지만 처음 로드 시킬 때와 다시 로드 시킬 때 값이 다르게 나온다. // 최초 로드 UIKeyboardFrameEndUserInfoKey ==> NSRect: .. 2023. 2. 1.
URL Scheme 다른 앱 또는 웹페이지 연결 수단으로 URL Scheme을 통해 다른 앱의 실행을 요청하거나 간단한 데이터를 전달 할 수 있다. 1. URL Scheme 문자열을 통해 URL 인스턴스 생성 NSString * url = ["URL Scheme url 입력" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 2. UIApplication의 canOpenURL 메서드를 통해 URL Scheme의 유효성 확인 [[UIApplication sharedApplication] canOpenURL:"URL입력"]; 3. 유효한 URL Scheme으로 확인된 경우 openURL 메서드 호출 [[UIApplication sharedApplication].. 2023. 1. 26.
present된 ViewController에 push 현재 위치한 VC에서 새로운 VC를 present로 보여줄 경우 present된 VC는 navigationController에 종속되어 있지 않기 때문에 또 다른 VC를 push하여 보여 줄 수 없다. 그래서 새로운 navigationController의 rootVC를 만들어 주어야 한다. 1. navigatonController의 rootViewController가 될 = present 될 viewController 설정 @IBAction func policy(_ sender: UIButton) { // present될 policyVC guard let policy = self.storyboard?.instantiateViewController(withIdentifier: StoryboardName.p.. 2023. 1. 26.
Expandable tableView Cell(셀 확장) 셀을 누르면 아래로 상세 내용이 펼쳐지는 UI를 만들 때는 상세 내용을 hidden 시켰다가 셀이 눌리면 보여주는 형식으로 구현하면 된다 1. 셀을 눌렀을 때 보여줄 view를 'myView.isHidden = true' 로 만든다. 2. 셀이 눌리면 myView의 isHidden 상태를 반전 시켜주고, 해당 셀을 reload시켜준다. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { myView.isHidden = !myView.isHidden tableView.reloadRows(at: [IndexPath(row: indexPath.row, section: 0)], with: .automatic) } 3. 셀.. 2023. 1. 26.
빌드한 앱의 권한 제어 앱에서 필요한 권한들을 설정에서 사용자가 허용 여부를 설정할 수 있다. 예전엔 설정 메인에서 빌드 시킨 앱도 보였던것 같은데.. 어느 순간부터 메인에서는 보이지 않고 따로 개인 정보 보호 탭에서 확인이 된다. 개인 정보 보호에서, 사용하려는 정보에 해당하는 카테고리를 선택하여 빌드한 앱의 권한을 변경 할 수 있다. 예를 들어, 위치 권한에 대한 앱 설정에 접근 하고 싶다면 설정 > 개인 정보 보호 > 위치 서비스 에서 빌드 한 앱 이름 확인이 가능하다 참고: https://support.apple.com/ko-kr/guide/iphone/iph251e92810/ios 2023. 1. 11.
설정앱의 특정 화면으로 이동?? 앱의 권한이 필요할 때 설정 요청을 하게 될 때가 있다 예를 들어, 위치서비스를 켜야 할 때 설정으로 이동해서 위치서비스 활성화 요청을 하게 되는데. 이전에는 설정앱의 스키마를 이용해서 바로 화면을 띄울 수 있었다. 그러나 iOS16 부터는 private API로 변경되면서 직접 화면으로 이동할 수 없게 되었다. UIApplication.shared.open(URL(string: "App-prefs:LOCATION_SERVICES")!) 이전에는 위와 같은 방식으로 가능했다. 이제는 UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!, options: [:], completionHandler: nil) 이 방식을 사용해서.. 2023. 1. 6.
CustomView의 super customView가 사용되는 곳에 따라 형태나 동작을 다르게 하고 싶을 때가 있다. 그래서 현재 customView의 위치를 가져오기 위해 방법을 찾아보면 - (UIViewController *) firstAvailableUIViewController { UIResponder *responder = [self nextResponder]; while (responder != nil) { if ([responder isKindOfClass:[UIViewController class]]) { return (UIViewController *)responder; } responder = [responder nextResponder]; } return nil; } 위 와 같은 직접 view가 controller를.. 2023. 1. 4.