Skip to main content

Posts

Showing posts from September, 2019

Đẩy TextField lên trên bàn phím

Chúng ta có một vấn đề như thế này: nếu Text Field ở gần phía đấy màn hình, khi keyboard được bật lên nó sẽ che mốt ô text cần nhập. Chúng ta sẽ cần xử lý để đẩy ô Text Field lên phía trên của Key board Chúng ta sẽ phải lắng nghe sự kiện ẩn, hiện của keyboard   NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: .UIKeyboardWillShow, object: nil)  NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: .UIKeyboardWillHide, object: nil) @objc func keyboardWillShow(notification: NSNotification) {         if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {             guard let globalPoint =  textField.superview?.convert(textField.frame.origin, to: nil) else {                 return             }             if globalPoint.y + 50 > heightScreen - keyboardSize.height {                 distanceConstraint.constant = CGFloat(ke

Struct vs Classes

Khi làm việc trong Swift có khi nào bạn tự hỏi khi nào thì sử dụng Struct, khi nào thì sử dụng Classes không ? bài viết trên medium: https://medium.com/better-programming/struct-vs-classes-in-swift-the-differences-explained-1e164a22efa6 Cannot assign to property: function call returns immutable value. Bạn có lẽ không phải là người đầu tiên quay lại sử dụng class khi gặp phải lỗi trên. Một structs dường như quá khó để làm việc cùng. Hy vọng sau khi đọc xong bài viết này bạn sẽ làm việc với structs dễ dàng hơn. Class trong Swift là gì? Một class là một kiểu tham chiếu (reference type) trong Swift. Nó có thể bao gồm: . properties . methods . subscripts . initializers . protocol conformances . extensions Nó thường được miêu tả như một định nghĩa mẫu cho một đối tượng, như khởi tạo Article sau đây: class ArticleClass {     let title: String     let url: URL     var readCount: Int = 0     init(title: String, url: URL) {         self.title = title         self.u

Alamofire vs URLSession

Alamofire vs URLSession: a comparison for networking in Swift Alamofire and URLSession both help you to make network requests in Swift. The URLSession API is part of the foundation framework, whereas Alamofire needs to be added as an external dependency. Many  developers  doubt  whether it’s needed to include an extra dependency on something basic like networking in Swift. In the end, it’s perfectly doable to implement a networking layer with the great URLSession API’s which are available nowadays. This blog post is here to compare both frameworks and to find out when to add Alamofire as an external dependency. Build better iOS apps faster Looking for a great mobile CI/CD solution that has tons of iOS-specific tools, smooth code signing, and even real device testing? Learn more about Bitrise’s iOS specific solutions! This shows the real power of Alamofire as the framework makes a lot of things easier. What is Alamofire? Where URLSession can be found within the s

Dependency Injection in Swift

Bài viết gốc: https://medium.com/makingtuenti/dependency-injection-in-swift-part-1-236fddad144a Khi bạn đang phát triển ứng dụng sử dụng mô hình (paradigm) OOP, bạn sẽ nhận ra (realize) rằng, nếu bạn muốn khả năng kiểm thử phần mềm, bạn cần sử dụng nguyên tắc(principle) IoC IoC - Inversion of Control: là nguyên lý phát triển phần mềm rất trừu tượng khó hiểu :(( Thông thường, kiến trúc này, chúng ta sử dụng mẫu dependency ịnection, loại sẽ cung cấp mỗi class dependencies nó cần. Trong bài viết này, tôi sẽ chỉ ra một con đường sử dụng pattern này trong Swift. Nếu như bạn không quan tâm về việc testing ứng dụng của bạn, tôi sẽ giới thiệu bạn ứng dụng nguyên tắc này trong code của bạn, bạn sẽ thấy nó hữu ích trong những dự án lớn.  Using default values in constructors Trong Swift, chúng ta có thể implement một ịnjection ngu ngốc bằng cách sử dụng giá trị default trong constructor. class ContactsRepository { let contactsDataSource: ContactsDataSource init(contacts

Vòng đời của 1 ứng dụng iOS

Vòng đời của 1 ứng dụng khá là quan trọng đối với các bạn developer - những người luôn muốn mang tới các trải nghiệm, phong phú, đa dạng và tốt nhất cho người dùng. Từ viết tắt và giải thích Trong bài có một số thuật ngữ thật sự dịch ra tiếng Việt sẽ rất khó hiểu nên mình xin phép giữ nguyên 1 vài thuật ngữ để các bạn dễ hiểu. :v dù gì code và làm việc cũng dùng tiếng anh và đụng tới chúng mà 1 số từ viết tắt trong bài: App --- Application --- Ứng dụng OS --- Operation system --- hệ điều hành Springboard: Ứng dụng tiêu chuẩn quản lý màn hình chính của iOS trong hệ điều hành iOS Vậy thì app khởi động như thế nào? Khi user mở điện thoại của mình lên thì không có ứng dụng nào chạy cã ngoài những thứ nằm trong OS. App của bạn cũng sẽ không chạy. Sau khi user nhấn vào icon của app, Springboard sẽ kích hoạt app của bạn. App cùng với các thư viện của nó sẽ được thực thi và được tải vào bộ nhớ, trong khi đó thì Springboard sẽ nhận nhiệm vụ hiển thị màn hình launch s

Phân biệt 3 method setNeedsLayout() , layoutIfNeeded() và layoutSubviews()

Phân biệt 3 method setNeedsLayout() , layoutIfNeeded() và layoutSubviews() Khi lập trình iOS, chắc hẳn các bạn cũng đã từng gặp/sử dụng qua 3 method trên, cả 3 đều có chung tiền tố layout, và cùng có vai trò xử lý layout của view. Điều này dẫn đến ít nhiều sự nhầm lẫn về bản chất và cách sử dụng của chúng, vì vậy ở bài viết này tôi sẽ làm rõ hơn về bản chất và cách sử dụng của 3 method này. Khi một ứng dụng iOS khởi chạy, class UI, UIApplication trong iOS sẽ chạy main run loop trên main thread. Vòng lặp main run loop tổng hợp các event từ user như (chạm, ấn, giữ...) và xử lý update giao diện phù hợp với từng thao tác. Tại một vài thời điểm nào đó, tất cả các event sẽ được xử lý và control sẽ quay trở lại run loop để chờ và thực thi chuỗi thao tác tiếp theo. Đầu tiên thì chúng ta cần phải hiểu về khái niệm Run Loop , Run loop là một cơ chế bất đồng bộ của iOS được sử dụng cho việc xử lý hệ thống input cho ứng dụng như sockets, ports, file, keyboard, mouse..vv. Từ cách

TableView: Implementing automatic row height

 First, you have to use auto layout and elements that have an intrinsic content size. For example, that’s the case for a label. So let’s drag and drop a label inside a table view cell and set constraints for top, bottom, left and right margin to the container:   As you can see, there is no height constraint for the label. We don’t want this because the height is dynamic and the label calculates the height on itself – also called intrinsic content size. In order for the label to do that, it has to use as many lines as necessary. For that, we set the number of lines to 0 and use “word wrap” as line break mode: Now there are just two things left: We have to set the row height to automatic and also specify an estimated row height. For that, we can set these properties in the corresponding view controller: override func viewDidLoad() { super.viewDidLoad() tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 44 }

Quản lý bộ nhớ trong iOS - Basic Memory Management in iOS

Chủ đề hôm nay mình muốn nói tới là một vấn đề nền tảng đối với tất cả mọi người khi mới bắt đầu tiếp cận với lập trình iOS, “Quản lý bộ nhớ” aka Memory Management. Ắt hẳn, những người mới bước chân vào con đường lập trình mobile nói chung, hoặc iOS nói riêng sẽ liên tục nghe những anh bề trên (hay còn gọi là senior thần thánh của chúng ta) nói về quản lý bộ nhớ quan trọng như thế nào khi lập trình trên thiết bị có bộ nhớ hạn chế như điện thoại. Những từ ngữ được nhắc đi nhắc lại như ARC , non-ARC, Reference Count,… blah blah. Và bạn sẽ kiểu như: “WTH! Mấy cha này nói cái gì vậy”. Rồi tiếp đó lại tới những vấn đề sẽ gặp khi quản lý bộ nhớ không tốt như : leak memory, stack overflow, rồi lại tới crash ( ác mộng của tất cả developers). Các bạn sẽ dường như là: “Thôi thôi! Dẹp hết… mệt quá :’( Quan tâm làm gì ba cái này, làm đại cho xong cho rồi…hiu hiu). F*CK THAT SHIETT ! I’M OUT Vậy quản lý bộ nhớ thật sự là gì? Quản lý bộ nhớ có thể được hiểu một cách đ