UITableview với nhiều hơn một ô tùy chỉnh với Swift


111

Tôi muốn sử dụng UITableview với các tableViewCell tùy chỉnh khác nhau. 3 ô của tôi là như vậy:

  • Ô1: phải có hình ảnh và nhãn.
  • Ô2: nên có hai nhãn.
  • Ô 3: nên có một DayPicker.

Tôi không muốn viết mã thẻ cho các ô. Làm cách nào để quản lý điều này trong Swift. Tôi có phải viết mã lớp riêng cho mỗi ô không? Tôi có thể sử dụng một tableviewController không? Làm cách nào để điền dữ liệu vào các ô khác nhau?

Tôi muốn tạo một tableView, giống như một ứng dụng liên hệ của thiết bị iOS.



Câu trả lời:


270

Hãy để tôi bắt đầu với việc trả lời các câu hỏi của bạn trước.

Tôi có phải viết mã một lớp riêng cho mỗi ô không? => Vâng, tôi tin là như vậy. Ít nhất, tôi sẽ làm theo cách đó.

Tôi có thể sử dụng một tableviewController không? => Có, bạn có thể. Tuy nhiên, bạn cũng có thể có dạng xem bảng bên trong Bộ điều khiển dạng xem của mình.

Làm cách nào để điền dữ liệu vào các ô khác nhau? => Tùy theo điều kiện mà bạn có thể điền dữ liệu vào các ô khác nhau. Ví dụ: giả sử rằng bạn muốn hai hàng đầu tiên của mình giống như loại ô đầu tiên. Vì vậy, bạn chỉ cần tạo / sử dụng lại loại ô đầu tiên và thiết lập dữ liệu của nó. Nó sẽ rõ ràng hơn, khi tôi cho bạn xem ảnh chụp màn hình, tôi đoán vậy.

Hãy để tôi cung cấp cho bạn một ví dụ với TableView bên trong ViewController. Khi bạn hiểu khái niệm chính, bạn có thể thử và sửa đổi theo cách nào bạn muốn.

Bước 1: Tạo 3 TableViewCell tùy chỉnh. Tôi đặt tên nó là FirstCustomTableViewCell, SecondCustomTableViewCell, ThirdCustomTableViewCell. Bạn nên sử dụng những cái tên có ý nghĩa hơn.

nhập mô tả hình ảnh ở đây

Bước 2: Truy cập Main.storyboard và kéo và thả TableView bên trong View Controller của bạn. Bây giờ, chọn chế độ xem bảng và đi tới trình kiểm tra danh tính. Đặt "Các ô nguyên mẫu" thành 3. Ở đây, bạn vừa nói với TableView của mình rằng bạn có thể có 3 loại ô khác nhau.

nhập mô tả hình ảnh ở đây

Bước 3: Bây giờ, chọn ô đầu tiên trong TableView của bạn và trong trình kiểm tra danh tính, hãy đặt "FirstCustomTableViewCell" vào trường lớp Tùy chỉnh và sau đó đặt định danh là "firstCustomCell" trong trình kiểm tra thuộc tính.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Làm tương tự cho tất cả những người khác - Đặt các Lớp tùy chỉnh của họ tương ứng là "SecondCustomTableViewCell" và "ThirdCustomTableViewCell". Đồng thời đặt các số nhận dạng là secondCustomCell và thirdCustomCell liên tiếp.

Bước 4: Chỉnh sửa Lớp ô tùy chỉnh và thêm cửa hàng theo nhu cầu của bạn. Tôi đã chỉnh sửa nó dựa trên câu hỏi của bạn.

Tái bút: Bạn cần đặt các cửa hàng dưới định nghĩa lớp.

Vì vậy, trong FirstCustomTableViewCell.swift, bên dưới

class FirstCustomTableViewCell: UITableViewCell {

bạn sẽ đặt nhãn và cửa hàng xem hình ảnh của bạn.

 @IBOutlet weak var myImageView: UIImageView!
 @IBOutlet weak var myLabel: UILabel!

và trong SecondCustomTableViewCell.swift, hãy thêm hai nhãn như-

import UIKit

class SecondCustomTableViewCell: UITableViewCell {

    @IBOutlet weak var myLabel_1: UILabel!
    @IBOutlet weak var myLabel_2: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

và ThirdCustomTableViewCell.swift sẽ giống như-

import UIKit

class ThirdCustomTableViewCell: UITableViewCell {

    @IBOutlet weak var dayPicker: UIDatePicker!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

Bước 5: Trong ViewController của bạn, tạo Outlet cho TableView của bạn và thiết lập kết nối từ bảng phân cảnh. Ngoài ra, bạn cần thêm UITableViewDelegate và UITableViewDataSource trong định nghĩa lớp làm danh sách giao thức. Vì vậy, định nghĩa lớp của bạn sẽ giống như-

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

Sau đó, đính kèm UITableViewDelegate và UITableViewDatasource của chế độ xem bảng vào bộ điều khiển của bạn. Tại thời điểm này, viewController.swift của bạn sẽ giống như-

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

Tái bút: Nếu bạn đang sử dụng TableViewController thay vì TableView bên trong ViewController, bạn có thể đã bỏ qua bước này.

Bước 6: Kéo và thả các chế độ xem hình ảnh và nhãn trong ô của bạn theo lớp Ô. và sau đó cung cấp kết nối với các cửa hàng của họ từ bảng phân cảnh.

Bước 7: Bây giờ, viết các phương thức cần thiết của UITableViewDatasource trong bộ điều khiển chế độ xem.

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        if indexPath.row == 0 {
            let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "firstCustomCell")
            //set the data here
            return cell
        }
        else if indexPath.row == 1 {
            let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "secondCustomCell")
            //set the data here
            return cell
        }
        else {
            let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "thirdCustomCell")
            //set the data here
            return cell
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

1
Tôi nhận được thông báo: "Không thể truyền giá trị của loại 'UITableViewCell' (0x1dfbfdc) thành 'Projekt.TitelTableViewCell' (0x89568)" trong func cellForRowAtIndexPath. Tôi đang sử dụng UITableViewController và tôi có một lớp "TitelTableViewCell" cho ô tùy chỉnh "TitelZelle", mà tôi đã đặt trong trình kiểm tra danh tính của Ô "TitelZelle". Tôi phải làm gì đây?
Easyglider

Tôi đã nhập di động của mình là! TitelTableViewCell để điền các phần tử giao diện người dùng tùy chỉnh của tôi vào ô này.
Easyglider

7
hãy thử cái này => let cell = tableView.dequeueReusableCellWithIdentifier ("TitelZelle", forIndexPath: indexPath) dưới dạng TitelTableViewCell
Natasha

2
@PradipKumar, vấn đề là gì? Lỗi của bạn là gì? Btw, bạn nên đặt một câu hỏi nếu bạn có bất kỳ câu hỏi nào. Tác giả đã đăng nhận xét được cho là để giúp hiểu hoặc làm rõ điều này liên quan đến vấn đề cụ thể. Nếu bạn có vấn đề, bạn nên đặt câu hỏi và bắt đầu bài viết của riêng bạn.
Natasha

1
numberOfRowsInSection giúp chế độ xem bảng xác định có bao nhiêu hàng, chúng ta muốn. Vì vậy, bạn chỉ nên cung cấp mệnh đề sẽ giúp phương pháp xác định số hàng. indexpath.row == 0 nghĩa là bạn đã có một hàng nhưng tại thời điểm đó, bảng của bạn không biết nó có hàng hay không. Vì vậy, bạn nên làm như vậy.
Natasha

32

Bản cập nhật Swift 3.0 + với mã tối thiểu

Khái niệm cơ bản: Tạo chế độ xem bảng với nguyên mẫu ô động. Gán số nhận dạng và tạo lớp ô xem bảng tùy chỉnh cho mỗi nguyên mẫu ô. Khởi tạo và hiển thị các ô tùy chỉnh trong phương thức đại biểu của dạng xem bảng.

1. Tạo ô trên bảng phân cảnh

Kéo một tableView vào bộ điều khiển chế độ xem của bạn, thêm các ô nguyên mẫu vào nó, sau đó thả phần tử giao diện người dùng vào các ô chế độ xem bảng của bạn, thêm ràng buộc đúng cách nếu cần.

nhập mô tả hình ảnh ở đây

2. Tạo các UITableViewCelllớp tùy chỉnh

Thêm mã sau vào dự án của bạn. Tôi đang đặt nó ngay trên lớp bộ điều khiển chế độ xem.

class FirstTableCell: UITableViewCell {
}

class SecondTableCell: UITableViewCell {
}

class ThirdTableCell: UITableViewCell {   
}

3. Gán lớp tùy chỉnh và mã định danh cho các nguyên mẫu ô

Đối với mỗi nguyên mẫu ô trong bảng phân cảnh, hãy chỉ định lớp tùy chỉnh được tạo từ bước 2, sau đó nhập một số nhận dạng duy nhất.

nhập mô tả hình ảnh ở đây

4. Kết nối các phần tử giao diện người dùng với mã nhanh

Điều khiển kéo chế độ xem bảng và kết nối với lớp bộ điều khiển chế độ xem. Control kéo các phần tử giao diện người dùng được thêm vào nguyên mẫu ô ở bước 1 và kết nối với lớp ô chế độ xem bảng tương ứng.

nhập mô tả hình ảnh ở đây

5. Thêm mã để xem bộ điều khiển và điều khiển chế độ xem bảng

Làm cho bộ điều khiển chế độ xem của bạn phù hợp với đại biểu chế độ xem bảng

class YourViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

Trong viewDidLoad, thiết lập nguồn dữ liệu và đại biểu của chế độ xem bảng.

override func viewDidLoad() {
    super.viewDidLoad()

    self.tableView.dataSource = self
    self.tableView.delegate = self

}

Cuối cùng, thêm hai phương thức ủy quyền để kiểm soát chế độ xem bảng của bạn, theo yêu cầu tối thiểu.

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 3
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.row == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "firstTableCell") as! FirstTableCell
        // Set up cell.label
        return cell
    } else if indexPath.row == 1 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "secondTableCell") as! SecondTableCell
        // Set up cell.button
        return cell
    } else {
        let cell = tableView.dequeueReusableCell(withIdentifier: "thirdTableCell") as! ThirdTableCell
        // Set up cell.textField
        return cell
    }
}

6. Hãy thử :)

nhập mô tả hình ảnh ở đây


Tuyệt diệu! Tôi thích hình ảnh động của bạn.
iphaaw

Bạn có thể vui lòng cho tôi biết, Có thể đặt tiêu đề cho mỗi ô không? nếu vậy, làm thế nào?
Pruthvi Hariharan

@PruthviHariharan nếu bạn muốn có “tiêu đề” cho mọi hoặc hầu hết các ô của mình, thì không nên triển khai tiêu đề ô hoặc phần tiêu đề, điều này cần nhiều mã hơn để quản lý và sẽ ảnh hưởng đến hiệu suất. Đề xuất của tôi là đặt một chế độ xem trên đầu ô nguyên mẫu của bạn và làm cho nó trông giống như một “tiêu đề”
Fangming

@FangmingNing Bạn có thể vui lòng giải thích bằng một ví dụ nhỏ. Cảm ơn bạn
Pruthvi Hariharan

Bạn không cần bước 5 nếu bạn đang sử dụng UITableViewController thay vì UIViewController.
Deepak Thakur

0

Các câu trả lời trên là câu trả lời tốt nhất, nhưng có HÀNG TẤN lý do để nhận được vấn đề này. Đây là một giải pháp tiềm năng khác cho bất kỳ ai gặp vấn đề này:

Vấn đề của tôi là tôi đang chuyển sang lớp ViewController chứ không phải chế độ xem bảng phân cảnh. Vì vậy, tham chiếu của tôi đến ô bảng phân cảnh là vô nghĩa, vì bảng phân cảnh không được sử dụng.

Tôi đã làm điều này:

let viewControllerB = SubViewController()
viewControllerB.passedData = diseases[indexPath.row].name
navigationController?.pushViewController(viewControllerB, animated: true)

Và tôi cần phải làm điều gì đó như sau:

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "SubViewStoryboardController") as! SubViewController
nextViewController.passedData = diseases[indexPath.row].name
self.present(nextViewController, animated:true, completion:nil)

Hy vọng điều này sẽ giúp ai đó.


-22

UITableViewControllerlà kế thừa UIViewControllermà đã có UITableviewDataSource& UITableviewDelegateánh xạ trên chính nó.

Bạn có thể phân lớp UITableViewControllerhoặc sử dụng TableViewbên trong của bạn ViewController. Sau đó, bạn phải triển khai các phương thức bắt buộc ( cellForRowAtIndexPath and numberOfRowsInSection) được khai báo trong UITableviewDataSource.

Ngoài ra trong bảng phân cảnh, bạn cần tạo nguyên mẫu ô với Id duy nhất.

Có các loại ô cơ bản, với (ví dụ: tiêu đề, phụ đề) - bạn cũng có thể sử dụng chúng nếu không cần cấu hình đặc biệt.

Vì vậy, đối với bộ chọn, có, bạn cần tạo ô tùy chỉnh của riêng mình. Tạo bộ UITableViewCellchọn ngày tổ chức lớp tùy chỉnh cần thiết và đảm bảo sử dụng ủy quyền để gửi lại kết quả mong muốn cho bạn ViewController.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.