Slim tableview
ios
54
swift
69
White

VietHQ viết ngày 08/06/2017

1.Tản mạn

Cách đơn giản nhất để giảm bớt bug là viết code ít đi. Chân lý đó đã được đưa vào một định luật nổi tiếng, hồi phổ thông ai cũng từng kinh qua.

e = mc2

image2

Dịch một cách chân phương là error = more code (càng nhiều code càng gây lỗi). Khoảng cách giữa coder và tester phụ thuộc vào việc có bao nhiêu bug sinh ra. Einstein khi đưa ra định luật đó, chắc không ngờ rằng nó có thể dịu dàng đúng (theo một cách mới) với cả ngành IT này. Thế nên viết ngắn đi mà vẫn dễ hiểu luôn luôn được những lười-biếng-coder coi là tôn chỉ.

Khi sử dụng tableview chúng ta luôn đi theo một format chung, thậm chí gõ đến thuộc lòng, không cần autocomplete.

self.listTbl.register( UINib( nibName: String(describing: GGArtistryCell.self), bundle: nil), 
    forCellReuseIdentifier: "cell")

Cả những khi dequeue nữa

let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

Những đoạn code này hơi dài, vậy nên chúng ta, những lười-biếng-coder, nên làm ngắn nó đi tí.
Mình sẽ sử dụng protocolgenerics để việc đăng kí và dequeue cell ngắn gọn hơn.

2. Make up

Làm việc với objc, mình hay tạo baseCell có 2 hàm getNibgetNibName (cho identifier) để việc đăng kí cell trở nên ngắn gọn hơn. Tuy nhiên ở swift, mình sẽ sử dụng protocol.

/**
    cell protocol for uicollectionview, uitableview
 */
protocol GGBaseCellProtocol {
    static func getNibName() -> String // return nibname of cell
    static func getNib() -> UINib // return nib of cell
}


/**
    default implement for cell
 */
extension GGBaseCellProtocol where Self : UIView {
    static func getNibName() -> String {
        return String(describing: self)
    }

    static func getNib() -> UINib {
        return UINib.init(nibName: self.getNibName(), bundle: nil)
    }
}

Tạo extension cho protocol để ta không phải khai báo đi, khai báo lại 2 hàm getNibgetNibName ở mỗi class implement lại protocol này. Khi đó ta chỉ cần cho custom cell của mình kế thừa lại protocol. Khá là linh động. Code lúc đó sẽ ngắn đi chút ít nhưng nhìn clear hơn.

Ví dụ như thế này

self.listTbl.register(GGArtistryCell.getNib(), 
    forCellReuseIdentifier: GGArtistryCell.getNibName())

Khá là đẹp rồi phải không? tuy nhiên ta có thể code ngắn hơn nữa bằng cách sử dụng generics.

extension UITableView {
    func on_register< T : GGBaseCellProtocol>(type: T.Type)  {
        self.register(T.getNib(), forCellReuseIdentifier: T.getNibName())
    }

    func on_dequeue< T : GGBaseCellProtocol>(idxPath : IndexPath) -> T {
        guard let cell = self.dequeueReusableCell(withIdentifier: T.getNibName(), for: idxPath) as? T else {
            fatalError("couldnt dequeue cell with identifier \(T.getNibName())")
        }

        return cell
    }
}

Để cho gọn, mình tạo extension cho UITableView, với 2 hàm on_registeron_dequeue làm 2 việc mà ai cũng biết là việc gì rồi.

Khi đó bước đăng kí cell sẽ ngắn đi như sau:

self.listTbl.on_register(type: GGArtistryCell.self)

So với trước thì ngắn gọn đi khá nhiều, coder không phải viết dài dòng nữa.

Tiếp đến là dequeue cũng ngắn không kém phần

Thay vì:

if let cell = self.listTbl.dequeueReusableCell(withIdentifier: GGArtistryCell.getNibName(), for: indexPath) as? GGArtistryCell {
    // your code
}

Ta chỉ cần

let cell : GGArtistryCell = self.listTbl.on_dequeue(idxPath: indexPath)

Bây giờ mình đã có thể lười đi tí :smile:

Ta có thể áp dụng phương pháp này cho cả collectionView

3. Kết

Lời cuối sẽ là một siêu tip để code ngắn gọn

MVC = Most Viable Cocoapod.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

VietHQ

11 bài viết.
5 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
5 1
Thời gian đầu làm việc với objc mình khá băn khoăn trong việc sử dụng các thuộc tính trong property như strong, weak, copy, assign. Nhân lúc rảnh r...
VietHQ viết hơn 3 năm trước
5 1
White
5 0
1. Giới thiệu Từ hồi mới bắt đầu làm IOS, thằng nào cũng hỏi mình có biết sử dụng AFNetworking không? Khổ nỗi lúc đó, mình mới chuyển từ làm game ...
VietHQ viết hơn 1 năm trước
5 0
White
4 0
Giới thiệu Callback là kĩ thuật được ưa chuộng trong lập trình hiện nay. Ngặt nỗi, nếu sử dụng không khéo rất dễ xảy ra callback hell. Dưới con mắ...
VietHQ viết 4 ngày trước
4 0
Bài viết liên quan
White
2 3
Xin chào mọi người. Mình xin chia sẽ một UILabel Helper nhỏ dùng trong truờng hợp cần tính chiều cao của UILabel để xác định "Show More" button có ...
DonDinh viết hơn 3 năm trước
2 3
White
11 4
(Link) (Link) (Link) Ở 2 phần tut trước, mình đã hướng dẫn khá chi tiết cách viết một ứng dụng camera có tích hợp chức năng nhận diện khuôn mặ...
HoangPH viết hơn 3 năm trước
11 4
Male avatar
0 0
RxSwift: Bài 6: RxCocoa (Part 4) Units ===== Updated ngày 30/06 Updated một chút: Vì những bất tiện và không rõ ràng về thông tin của kipalog, mì...
Bùi Khánh Duy viết 7 tháng trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
11 bài viết.
5 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!