본문 바로가기

ios24

[iOS] 현재 윈도우의 가장 상위 뷰컨트롤러 구하기 Get root ViewController from key window. var windowTopVc: UIViewController { if var root = UIApplication.shared.keyWindow?.rootViewController { while (root.presentedViewController != nil) { if root.presentedViewController != nil { root = root.presentedViewController! } } return root } return self } 2019. 8. 9.
[iOS] 유용하지만 잘 모르는 Foundation Class 본 글 요약 : Useful obscure Foundation types in Swift NSScanner NSScanner를 사용하면 문자열에서 숫자 또는 문자들을 순서대로 찾아낼 수 있다. public func extractIntsFrom(string: String) -> [Int] { var result: [Int] = [] let scanner = Scanner(string: string) // 숫자가 아닌 것은 전부 건너뜀 scanner.charactersToBeSkipped = CharacterSet.decimalDigits.inverted var pointer: Int = 0 while scanner.isAtEnd == false { if scanner.scanInt(&pointer) { r.. 2019. 7. 4.
[Swift] Xcode 콘솔 로그 변경하기 Changing log style in Xcode console Xcode 콘솔에서도 안드로이드 Logcat 처럼 print 값이 호출되는 위치와 코드라인 등을 표시할 수 있더라구요. 이제야 알게 되다니.. Literal Expression 문서에 잘 나와 있다. #file 은 파일 정보를 파라메터로 받을 수 있다. #line 은 코드 라인 정보를 받는다. #function은 함수 이름을 받는다. 아래 Log 함수를 전역에 만들고, public func Log(_ object: T?, filename: String = #file, line: Int = #line, funcName: String = #function) { #if DEBUG let th = Thread.current.isMainThread .. 2019. 4. 2.
[iOS] 테이블 셀의 업데이트 팁 cellForRowAt 는 해당 줄에 표시할 cell 인스턴스를 반환해준다. 만약 이때, 인스턴스 내에 레이아웃이 변경된다면 그 작업 또한 이때 해야 한다. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell willDisplay cell 는 해당 줄에 표시하는 cell 이 보여지는 시기에 호출되기 때문에 이미 정해진 레이아웃의 내용만 변경가능하다. func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 특히, 주의할 점은 UILabel 과 같이 텍스트에.. 2019. 3. 25.
[iOS] UICollectionView와 UITableView의 배치 업데이트 UICollectionView 와 UITableView 에서 데이터 변경사항을 반영할 때, 이런 함수들로 애니메이션 효과를 줄 수 있잖아요. func deleteItems(at: [IndexPath]) func moveSection(Int, toSection: Int) func moveItem(at: IndexPath, to: IndexPath) func insertItems(at: [IndexPath]) func insertSections(IndexSet) func deleteSections(IndexSet) 애니메이션을 통해 이런 효과를 얻게 되죠. 이런 작업은 2 개의 데이터 셋을 비교해서 변경사항을 블럭으로 묶어 performBatchUpdates 함수를 사용하게 됩니다. 이때 2 개의 데이터를 .. 2019. 3. 21.
[Swift] 테이블에서 스와이프 액션 버튼 변경하기 Making custom editing style using UISwipeActionsConfiguration in UITableView iOS 11부터 UITableView 에 스와이프 버튼을 추가할 수 있게 되었군요. UITableViewCell.EditingStyle 를 사용하지 않고 아래처럼 구현할 수 있게 되었어요. 다만.. 이미지의 원본 색상을 사용할 수 없다는 게 아쉽다. func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { let action = UIContextualAction(style: .no.. 2019. 3. 20.
[ios] Check if viewController is visible when presenting other view controller 다른 뷰 컨트롤러를 프리젠테이션 하거나 없애는 동안, 부모 뷰컨트롤러가 화면에 보이는지 여부를 이렇게 알아챌 수 있다. var observePresentation: NSKeyValueObservation? var isVisible = false override func viewDidLoad() { observePresentation = observe(\.presentationController, options: [.new]) { [weak self] obj, change in self?.isVisible = self?.presentedViewController == nil } } 2018. 6. 13.
[ReSwift] Reducer를 하나로 묶는 팁 Combine reducers that act on identical types 하나의 액션에 여러가지 리듀서들을 반응시키는 코드 팁 https://github.com/ReSwift/ReSwift/issues/340 func combineReducers(_ first: @escaping Reducer, _ remainder: Reducer...) -> Reducer { return { action, state in let firstResult = first(action, state) let result = remainder.reduce(firstResult) { result, reducer in return reducer(action, result) } return result } } // Usage: .. 2018. 4. 30.
[iOS] UIImage 모서리를 둥글게 또는 동그랗게 UIImage 모서리를 둥글게 또는 동그랗게 Make UIImage be rounded public extension UIImage { /// 모서리를 둥글게 func round(_ radius: CGFloat) -> UIImage { let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height) let renderer = UIGraphicsImageRenderer(size: rect.size) let result = renderer.image { c in let rounded = UIBezierPath(roundedRect: rect, cornerRadius: radius) rounded.addClip() if let cgImage = se.. 2018. 4. 10.
ReSwift - Subscribing to multiple states ReSwift 이슈 스레드에서 발견함 (issues 318) * 하나의 클래스에서 다양한 스테이트를 구독하는 방법 : ReRxSwift 를 사용하거나 아래와 같이 헬퍼 클래스를 활용할 수 있겠다. public class BlockSubscriber: StoreSubscriber { public typealias StoreSubscriberStateType = S private let block: (S) -> Void public init(block: @escaping (S) -> Void) { self.block = block } public func newState(state: S) { self.block(state) } } 아래처럼 활용.. class Sample { private lazy var s.. 2018. 1. 13.
스위프트 타입 체크 Check if instance is struct or class 클래스인지 구조체인지 확인 class TClass {} struct TStruct {} func who(_ any: Any) -> String { if Mirror(reflecting: any).displayStyle == .class { return "Class" } else { return "Struct" } } print(who("Hello")) // Struct print(who(TClass())) // Class print(who(TStruct())) // Struct print(who(1)) // Struct Check if generic type is which class 제네릭 타입이 특정 클래스 인지 확인 protocol .. 2018. 1. 10.
옵셔널 클로저는 escaping 이 기본이구나.. 클로저를 옵셔널이면 escaping 이 기본이다. from @escaping failing on optional blocks That is unfortunately the case for Swift 3. Here are the semantics for escaping in Swift 3:1) Closures in function parameter position are non-escaping by default2) All other closures are escapingThus, all generic type argument closures, such as Array and Optional, are escaping. This puts us in the very unfortunate situation wh.. 2017. 10. 13.