Nếu không có kết quả Chế độ xem bảng nào, hãy hiển thị “Không có kết quả” trên màn hình


114

Tôi có một tableview, trong đó đôi khi có thể không có bất kỳ kết quả nào để liệt kê, vì vậy tôi muốn đưa ra thông báo "không có kết quả" nếu không có kết quả (nhãn hoặc một ô xem bảng?).

Có cách nào dễ nhất để làm điều này không?

Tôi sẽ cố gắng một labelđằng sau tableviewmột ẩn sau đó của hai dựa trên kết quả, nhưng kể từ khi tôi đang làm việc với một TableViewControllervà không phải là một bình thườngViewController tôi không chắc chắn như thế nào thông minh hoặc doable đó là.

Tôi cũng đang sử dụng Parsevà phân lớp dưới dạng PFQueryTableViewController:

@interface TableViewController : PFQueryTableViewController

Tôi có thể cung cấp bất kỳ chi tiết bổ sung nào cần thiết, chỉ cần cho tôi biết!

TableViewController Cảnh trong Bảng phân cảnh:

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

CHỈNH SỬA: Theo Midhun MP, đây là mã tôi đang sử dụng

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSInteger numOfSections = 0;
    if ([self.stringArray count] > 0)
    {
        self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
        numOfSections                 = 1;
        //yourTableView.backgroundView   = nil;
        self.tableView.backgroundView = nil;
    }
    else
    {
        UILabel *noDataLabel         = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, self.tableView.bounds.size.height)];
        noDataLabel.text             = @"No data available";
        noDataLabel.textColor        = [UIColor blackColor];
        noDataLabel.textAlignment    = NSTextAlignmentCenter;
        //yourTableView.backgroundView = noDataLabel;
        //yourTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        self.tableView.backgroundView = noDataLabel;
        self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }

    return numOfSections;
}

Và đây là View tôi đang nhận, nó vẫn có các đường phân cách. Tôi có cảm giác rằng đây là một số thay đổi nhỏ, nhưng tôi không chắc tại sao các vạch phân cách lại hiển thị?

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


Tôi nghĩ mẹo là thiết lập footerView trống trên tableview để loại bỏ các dòng.
Ben Sinclair

@Andy Ý bạn là gì?
SRMR

Không sử dụng giải pháp được thêm vào câu hỏi này. Các phương thức nguồn dữ liệu dạng xem bảng không bao giờ được làm nhiều hơn những gì chúng phải làm. numberOfSectionssẽ trả về một số đếm và đó là nó. Tương tự cho numberOfRowsInSection. Chúng có thể được gọi nhiều lần bất cứ lúc nào. Không bao giờ cập nhật lượt xem hoặc cập nhật dữ liệu hoặc làm bất cứ điều gì ngoại trừ trả lại số lượng. Logic để cập nhật các khung nhìn không bao giờ được nằm trong các phương thức này.
rmaddy

Câu trả lời:


206

Bạn có thể dễ dàng đạt được điều đó bằng cách sử dụng backgroundViewthuộc tính của UITableView.

Mục tiêu C:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSInteger numOfSections = 0;
    if (youHaveData)
    {
        yourTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
        numOfSections                = 1;
        yourTableView.backgroundView = nil;
    }
    else
    {   
        UILabel *noDataLabel         = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, yourTableView.bounds.size.width, yourTableView.bounds.size.height)];
        noDataLabel.text             = @"No data available";
        noDataLabel.textColor        = [UIColor blackColor];
        noDataLabel.textAlignment    = NSTextAlignmentCenter;
        yourTableView.backgroundView = noDataLabel;
        yourTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }

    return numOfSections;
}

Nhanh:

func numberOfSections(in tableView: UITableView) -> Int
{
    var numOfSections: Int = 0
    if youHaveData
    {
        tableView.separatorStyle = .singleLine
        numOfSections            = 1
        tableView.backgroundView = nil
    }
    else
    {
        let noDataLabel: UILabel  = UILabel(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: tableView.bounds.size.height))
        noDataLabel.text          = "No data available"
        noDataLabel.textColor     = UIColor.black
        noDataLabel.textAlignment = .center
        tableView.backgroundView  = noDataLabel
        tableView.separatorStyle  = .none
    }
    return numOfSections
}

Tham chiếu tham chiếu lớp UITableView

backgroundView Bất động sản

Hình nền của khung nhìn bảng.

Tờ khai

Nhanh

var backgroundView: UIView?

Objective-C

@property(nonatomic, readwrite, retain) UIView *backgroundView

Thảo luận

Chế độ xem nền của chế độ xem bảng được tự động thay đổi kích thước để phù hợp với kích thước của chế độ xem bảng. Dạng xem này được đặt làm dạng xem phụ của dạng xem bảng phía sau tất cả các ô, dạng xem đầu trang và dạng xem chân trang.

Bạn phải đặt thuộc tính này thành nil để đặt màu nền của dạng xem bảng.


Cảm ơn câu trả lời! Điều này có nghĩa là tôi cần một tableViewổ cắm để tôi có thể làm gì yourTableView.backgroundView? Tôi đang sử dụng một TableViewControllernên tôi không có ổ cắm cho nó ngay bây giờ, đó là lý do tại sao tôi tự hỏi.
SRMR

1
UITableViewControllerđã có một thuộc tính được đặt tên tableViewnên bạn không cần tạo
Cihan Tek

Đã hiểu, đang sử dụngself.tableView
SRMR

1
Điều chỉnh. Khi thử nghiệm thêm, tôi thực sự phải làm cho dòng mà tôi đã đề cập trả lại cùng một giá trị. numOfSection = 1. Nếu tôi đặt nó bằng 0 và chế độ xem bảng của tôi trống, nó hoạt động, nhưng khi tôi tạo một ô và sau đó xóa nó, thay vì xóa và hiển thị thông báo, nó bị lỗi với lỗi sau. *** Đang chấm dứt ứng dụng do không có ngoại lệ 'NSInternalInconsistencyException', lý do: 'Lỗi nội bộ UITableView: không thể tạo bản đồ phần mới với số phần cũ: 1 và số phần mới: 0'. Tôi không biết tại sao trả về cùng một giá trị hoạt động, nhưng nó hoạt động và hoạt động như thế nào.
ChrisOSX

2
Không sử dụng giải pháp này. Các phương thức nguồn dữ liệu dạng xem bảng không bao giờ được làm nhiều hơn những gì chúng phải làm. numberOfSectionssẽ trả về một số đếm và đó là nó. Tương tự cho numberOfRowsInSection. Chúng có thể được gọi nhiều lần bất cứ lúc nào. Không bao giờ cập nhật lượt xem hoặc cập nhật dữ liệu hoặc làm bất cứ điều gì ngoại trừ trả lại số lượng. Logic để cập nhật các khung nhìn không bao giờ được nằm trong các phương thức này.
rmaddy

107

Đối với Xcode 8.3.2 - Swift 3.1

Đây là một cách không quá nổi tiếng nhưng cực kỳ dễ dàng để đạt được thêm chế độ xem "Không có mục" vào chế độ xem bảng trống quay trở lại Xcode 7. Tôi sẽ để nó cho bạn kiểm soát logic đó thêm / xóa chế độ xem nền của bảng, nhưng đây là quy trình cho và bảng phân cảnh Xcode (8.3.2):

  1. Chọn cảnh trong Bảng phân cảnh có chế độ xem bảng của bạn.
  2. Kéo một UIView trống vào "Scene Dock" của cảnh đó

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

  1. Thêm UILabel và bất kỳ ràng buộc nào vào dạng xem mới và sau đó tạo IBOutlet cho dạng xem đó

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

  1. Gán chế độ xem đó cho tableView.backgroundView

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

  1. Kìa điều kỳ diệu!

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

Cuối cùng, điều này hoạt động bất cứ lúc nào bạn muốn thêm một chế độ xem đơn giản vào bộ điều khiển chế độ xem của mình mà bạn không nhất thiết muốn hiển thị ngay lập tức, nhưng bạn cũng không muốn viết tay mã.


1
Kỹ thuật này hoạt động cho bất kỳ thứ gì mà bạn cần một cái nhìn đơn giản. Tôi cũng đã sử dụng nó cho các tiêu đề phần bảng tùy chỉnh. Thực sự, bạn có thể sử dụng nó cho bất kỳ thứ gì bạn cần xem. Chỉ cần tham chiếu qua IBOutlet và thêm nó làm chế độ xem phụ ở bất kỳ đâu bạn cần chế độ xem tùy chỉnh.
Paul Bonneville

Như @gmogames đã nói, sau khi làm IOS được 2 năm thì đây là lần đầu tiên biết về tableView background !. cảm ơn người đàn ông
Ali Adil

1
Cảm ơn vì điều đó. Để đưa nó ra khỏi đó, tôi phải sử dụng tableView.separatorStyle = .none và thay đổi kích thước UIView mặc định để xem backgroundView. Tôi đang sử dụng Xcode 9.4 với Swift 4.
Hammad Tariq

Bạn đặt chế độ xem tùy chỉnh như thế nào?
Nol4635

1
@ Nol4635 Trong trường hợp nền chế độ xem bảng, bạn chỉ cần gán chế độ xem bạn đã tạo dưới dạng IBOutlet cho nền của chế độ xem bảng hoặc nếu bạn chỉ muốn thêm chế độ xem vào bất kỳ chế độ xem nào khác, bạn có thể thêm chế độ xem đó làm chế độ xem phụ. Bạn sẽ phải đặt các giá trị khung, nhưng nó giống như bất kỳ chế độ xem nào khác.
Paul Bonneville

30

Phiên bản Swift của đoạn mã trên: -

func numberOfSectionsInTableView(tableView: UITableView) -> Int {

    var numOfSection: NSInteger = 0

    if CCompanyLogoImage.count > 0 {

        self.tableView.backgroundView = nil
        numOfSection = 1


    } else {

        var noDataLabel: UILabel = UILabel(frame: CGRectMake(0, 0, self.tableView.bounds.size.width, self.tableView.bounds.size.height))
        noDataLabel.text = "No Data Available"
        noDataLabel.textColor = UIColor(red: 22.0/255.0, green: 106.0/255.0, blue: 176.0/255.0, alpha: 1.0)
        noDataLabel.textAlignment = NSTextAlignment.Center
        self.tableView.backgroundView = noDataLabel

    }
    return numOfSection
}

Nhưng nếu bạn đang tải Thông tin từ JSON, bạn cần kiểm tra xem JSON có trống hay không, vì nếu bạn đặt mã như thế này, ban đầu nó sẽ hiển thị Thông báo "Không có dữ liệu" sau đó biến mất. Bởi vì sau khi bảng tải lại dữ liệu thông báo ẩn. Vì vậy, bạn có thể đặt mã này ở nơi tải dữ liệu JSON vào một mảng. VÌ THẾ :-

func numberOfSectionsInTableView(tableView: UITableView) -> Int {

    return 1
}

func extract_json(data:NSData) {


    var error: NSError?

    let jsonData: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers , error: &error)
    if (error == nil) {
        if let jobs_list = jsonData as? NSArray
        {
            if jobs_list.count == 0 {

                var noDataLabel: UILabel = UILabel(frame: CGRectMake(0, 0, self.tableView.bounds.size.width, self.tableView.bounds.size.height))
                noDataLabel.text = "No Jobs Available"
                noDataLabel.textColor = UIColor(red: 22.0/255.0, green: 106.0/255.0, blue: 176.0/255.0, alpha: 1.0)
                noDataLabel.textAlignment = NSTextAlignment.Center
                self.tableView.backgroundView = noDataLabel

            }

            for (var i = 0; i < jobs_list.count ; i++ )
            {
                if let jobs_obj = jobs_list[i] as? NSDictionary
                {
                    if let vacancy_title = jobs_obj["VacancyTitle"] as? String
                    {
                        CJobTitle.append(vacancy_title)

                        if let vacancy_job_type = jobs_obj["VacancyJobType"] as? String
                        {
                            CJobType.append(vacancy_job_type)

                            if let company_name = jobs_obj["EmployerCompanyName"] as? String
                            {
                                CCompany.append(company_name)

                                    if let company_logo_url = jobs_obj["EmployerCompanyLogo"] as? String
                                    {
                                        //CCompanyLogo.append("http://google.com" + company_logo_url)

                                        let url = NSURL(string: "http://google.com" + company_logo_url )
                                        let data = NSData(contentsOfURL:url!)
                                        if data != nil {
                                            CCompanyLogoImage.append(UIImage(data: data!)!)
                                        }

                                        if let vacancy_id = jobs_obj["VacancyID"] as? String
                                        {
                                            CVacancyId.append(vacancy_id)

                                        }

                                    }

                            }

                        }
                    }
                }
            }
        }
    }
    do_table_refresh();


}

func do_table_refresh() {

    dispatch_async(dispatch_get_main_queue(), {
        self.tableView.reloadData()
        return
    })
}

Điều này hoạt động rất tốt để hiển thị nhãn khi không có dữ liệu trong các hàng. Tuy nhiên, cách tốt nhất để xử lý khi dữ liệu đến và self.tableView.reloadData()được gọi là gì? Tôi thấy rằng nó đang thêm các hàng mới của tôi, nhưng hàng noDataLabelvẫn hiển thị bên dưới chúng.
tylerSF

1
Nếu bạn đã mảng mục chỉ cần đặt self.tableView.backgroundView = nil
Chathuranga Silva

if job_list.count == 0 {// thêm ở trên mã đã cho} else {self.tableView.backgroundView = nil}
Chathuranga Silva

hoàn hảo. thêm self.tableView.backgroundView = nilvào câu lệnh if của tôi trước khi return jobs_list.count hoạt động tốt. cảm ơn
tylerSF

Không sử dụng giải pháp đầu tiên trong câu trả lời này. Các phương thức nguồn dữ liệu dạng xem bảng không bao giờ được làm nhiều hơn những gì chúng phải làm. numberOfSectionssẽ trả về một số đếm và đó là nó. Tương tự cho numberOfRowsInSection. Chúng có thể được gọi nhiều lần bất cứ lúc nào. Không bao giờ cập nhật lượt xem hoặc cập nhật dữ liệu hoặc làm bất cứ điều gì ngoại trừ trả lại số lượng. Logic để cập nhật các khung nhìn không bao giờ được nằm trong các phương thức này.
rmaddy

6

Bạn có thể thử điều khiển này. Nó là khá gọn gàng. DZNEmptyDataSet

Hoặc nếu tôi là bạn, tất cả những gì tôi sẽ làm là

  • Kiểm tra xem mảng dữ liệu của bạn có trống không
  • Nếu nó trống thì hãy thêm một đối tượng có tên là @ "No Data" vào nó
  • Hiển thị chuỗi đó trong cell.textLabel.text

Dễ như ăn bánh


5

Swift 3 (đã cập nhật):

override func numberOfSections(in tableView: UITableView) -> Int {
    if myArray.count > 0 {
        self.tableView.backgroundView = nil
        self.tableView.separatorStyle = .singleLine
        return 1
    }

    let rect = CGRect(x: 0,
                      y: 0,
                      width: self.tableView.bounds.size.width,
                      height: self.tableView.bounds.size.height)
    let noDataLabel: UILabel = UILabel(frame: rect)

    noDataLabel.text = "Custom message."
    noDataLabel.textColor = UIColor.white
    noDataLabel.textAlignment = NSTextAlignment.center
    self.tableView.backgroundView = noDataLabel
    self.tableView.separatorStyle = .none

    return 0
}

Không sử dụng giải pháp này. Các phương thức nguồn dữ liệu dạng xem bảng không bao giờ được làm nhiều hơn những gì chúng phải làm. numberOfSectionssẽ trả về một số đếm và đó là nó. Tương tự cho numberOfRowsInSection. Chúng có thể được gọi nhiều lần bất cứ lúc nào. Không bao giờ cập nhật lượt xem hoặc cập nhật dữ liệu hoặc làm bất cứ điều gì ngoại trừ trả lại số lượng. Logic để cập nhật các khung nhìn không bao giờ được nằm trong các phương thức này.
rmaddy

Tôi đồng ý. Giải pháp này có thể được cải thiện, nhưng nó cũng có thể được sử dụng.
Teodor Ciuraru

Làm thế nào bạn có thể đồng ý rằng bạn không nên sử dụng giải pháp này nhưng sau đó nói rằng cũng có thể được sử dụng? Đó là một mâu thuẫn.
rmaddy

Tôi đồng ý rằng giải pháp này có thể được cải thiện, nhưng, ở trạng thái hiện tại, cũng sẽ hoạt động.
Teodor Ciuraru

5

Swift3.0

Tôi hy vọng nó phục vụ mục đích của bạn ...... Trong UITableViewController của bạn.

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if searchController.isActive && searchController.searchBar.text != "" {
        if filteredContacts.count > 0 {
            self.tableView.backgroundView = .none;
            return filteredContacts.count
        } else {
            Helper.EmptyMessage(message: ConstantMap.NO_CONTACT_FOUND, viewController: self)
            return 0
        }
    } else {
        if contacts.count > 0 {
            self.tableView.backgroundView = .none;
            return contacts.count
        } else {
            Helper.EmptyMessage(message: ConstantMap.NO_CONTACT_FOUND, viewController: self)
            return 0
        }
    }
}

Lớp trợ giúp với chức năng:

 /* Description: This function generate alert dialog for empty message by passing message and
           associated viewcontroller for that function
           - Parameters:
            - message: message that require for  empty alert message
            - viewController: selected viewcontroller at that time
         */
        static func EmptyMessage(message:String, viewController:UITableViewController) {
            let messageLabel = UILabel(frame: CGRect(x: 0, y: 0, width: viewController.view.bounds.size.width, height: viewController.view.bounds.size.height))
            messageLabel.text = message
            let bubbleColor = UIColor(red: CGFloat(57)/255, green: CGFloat(81)/255, blue: CGFloat(104)/255, alpha :1)

            messageLabel.textColor = bubbleColor
            messageLabel.numberOfLines = 0;
            messageLabel.textAlignment = .center;
            messageLabel.font = UIFont(name: "TrebuchetMS", size: 18)
            messageLabel.sizeToFit()

            viewController.tableView.backgroundView = messageLabel;
            viewController.tableView.separatorStyle = .none;
        }

Không sử dụng giải pháp này. Các phương thức nguồn dữ liệu dạng xem bảng không bao giờ được làm nhiều hơn những gì chúng phải làm. numberOfSectionssẽ trả về một số đếm và đó là nó. Tương tự cho numberOfRowsInSection. Chúng có thể được gọi nhiều lần bất cứ lúc nào. Không bao giờ cập nhật lượt xem hoặc cập nhật dữ liệu hoặc làm bất cứ điều gì ngoại trừ trả lại số lượng. Logic để cập nhật các khung nhìn không bao giờ được nằm trong các phương thức này.
rmaddy

3

Tôi nghĩ rằng cách tốt nhất để giải quyết vấn đề của bạn là chuyển từ a UITableViewControllersang a UIViewControllercó chứa a UITableView. Bằng cách này, bạn có thể thêm bất cứ thứ gì UIViewbạn muốn làm các lượt xem phụ của chế độ xem chính.

Tôi sẽ không khuyên bạn nên sử dụng UITableViewCell để làm điều này, bạn có thể cần thêm những thứ bổ sung trong tương lai và mọi thứ có thể nhanh chóng trở nên xấu đi.

Bạn cũng có thể làm điều gì đó như thế này, nhưng đây cũng không phải là giải pháp tốt nhất.

UIWindow* window = [[UIApplication sharedApplication] keyWindow];
[window addSubview: OverlayView];

Cảm ơn vì màu sắc xung quanh là cách trang nhã nhất để thực hiện, luôn luôn là một cách tốt để suy nghĩ về nó. Tôi có thể thử thay đổi bảng phân cảnh của mình để sử dụng bảng UIViewControllerchứa a UITableView.
SRMR

1
Đó là cách tốt nhất cho tương lai. Bản thân tôi chưa bao giờ sử UITableViewControllerdụng nó, bởi vì sử dụng nó không thực sự dễ dàng hơn nhiều so với làm theo cách khác, nhưng nó hạn chế khả năng thay đổi mọi thứ của bạn trong tương lai.
Cihan Tek

Đây không phải là bằng chứng trong tương lai nếu bạn có các thanh mờ. Tôi rất khuyên bạn nên chống lại. Ít nhất, hãy tạo một UIViewController có chứa UITableViewController và điều chỉnh mọi thứ một cách thích hợp.
xtravar

3

Sử dụng mã này trong numberOfSectionsInTableViewphương pháp của bạn : -

if ([array count]==0
{

    UILabel *fromLabel = [[UILabel alloc]initWithFrame:CGRectMake(50, self.view.frame.size.height/2, 300, 60)];                                                                                        
    fromLabel.text =@"No Result";
    fromLabel.baselineAdjustment = UIBaselineAdjustmentAlignBaselines;
    fromLabel.backgroundColor = [UIColor clearColor];
    fromLabel.textColor = [UIColor lightGrayColor];
    fromLabel.textAlignment = NSTextAlignmentLeft;
    [fromLabel setFont:[UIFont fontWithName:Embrima size:30.0f]];
    [self.view addSubview:fromLabel];
    [self.tblView setHidden:YES];
}

1
Không sử dụng giải pháp này. Các phương thức nguồn dữ liệu dạng xem bảng không bao giờ được làm nhiều hơn những gì chúng phải làm. numberOfSectionssẽ trả về một số đếm và đó là nó. Tương tự cho numberOfRowsInSection. Chúng có thể được gọi nhiều lần bất cứ lúc nào. Không bao giờ cập nhật lượt xem hoặc cập nhật dữ liệu hoặc làm bất cứ điều gì ngoại trừ trả lại số lượng. Logic để cập nhật các khung nhìn không bao giờ được nằm trong các phương thức này.
rmaddy

2

SWIFT 3

        let noDataLabel: UILabel     = UILabel(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: tableView.bounds.size.height))
        noDataLabel.text             = "No data available"
        noDataLabel.textColor        = UIColor.white
        noDataLabel.font             = UIFont(name: "Open Sans", size: 15)
        noDataLabel.textAlignment    = .center
        tableView.backgroundView = noDataLabel
        tableView.separatorStyle = .none

2

Nếu bạn không sử dụng chân trang của chế độ xem bảng và không muốn chế độ xem bảng lấp đầy màn hình với các ô bảng mặc định trống, tôi khuyên bạn nên đặt chân trang của chế độ xem bảng thành UIView trống. Tôi không biết cú pháp chính xác để thực hiện việc này trong obj-c hoặc Swift, nhưng trong Xamarin.iOS, tôi sẽ làm như thế này:

public class ViewController : UIViewController
{
    UITableView _table;

    public ViewController (IntPtr handle) : base (handle)
    {
    }

    public override void ViewWillAppear(bool animated) {
        // Initialize table

        _table.TableFooterView = new UIView();
    }
}

Đoạn mã trên sẽ dẫn đến chế độ xem bảng không có ô trống


2

Đây là giải pháp đã làm việc cho tôi.

  1. Thêm mã sau vào một tệp mới.

  2. Thay đổi lớp bảng của bạn thành lớp tùy chỉnh "MyTableView" từ bảng phân cảnh hoặc .xib

(điều này sẽ chỉ hoạt động cho phần đầu tiên. Nếu bạn muốn tùy chỉnh thêm, hãy thực hiện các thay đổi trong hàm reloadData () của MyTableView cho các phần khác)

public class MyTableView: UITableView {

    override public func reloadData() {
        super.reloadData()

        if self.numberOfRows(inSection: 0) == 0 {
            if self.viewWithTag(1111) == nil {
                let noDataLabel = UILabel()
                noDataLabel.textAlignment = .center
                noDataLabel.text = "No Data Available"
                noDataLabel.tag = 1111
                noDataLabel.center = self.center
                self.backgroundView = noDataLabel
            }

        } else {
            if self.viewWithTag(1111) != nil {
                self.backgroundView = nil
            }
        }
    }
}

Đây là một cách tiếp cận tốt. Tôi đã thêm một số cải tiến như sau để làm cho nó tròn trịa hơn. 1. Kiểu phân tách bộ nhớ cache của dạng xem bảng và khôi phục nó khi chuyển đổi trạng thái trống / không trống để làm cho lớp con này có thể áp dụng cho các trường hợp sử dụng mà kiểu dấu phân tách khác nhau được mong muốn. 2. Thêm @IBInspectable var emptyStateText: String?và đánh dấu lớp này vì @IBDesignablesau đó bạn sẽ có thể thay đổi văn bản trạng thái trống khác nhau cho các cảnh khác nhau trong bảng phân cảnh hoặc xibs. Thưởng thức! :)
Egist Li

1

Tôi sẽ trình bày một dạng xem lớp phủ có giao diện và thông báo bạn muốn nếu dạng xem bảng không có kết quả. Bạn có thể làm điều đó trong ViewDidAppear, vì vậy bạn có kết quả trước khi hiển thị / không hiển thị chế độ xem.


1

Nếu bạn muốn làm điều này mà không cần bất kỳ mã nào, hãy thử điều này!

Nhấp vào Chế độ xem bảng của bạn.

tableView Ảnh chụp màn hình

Thay đổi kiểu từ "đơn giản" thành "được nhóm".

Ảnh chụp màn hình thuộc tính Table View-2

Bây giờ khi bạn sử dụng….

tableView.backgroundView = CHÈN NHÃN HOẶC XEM CỦA BẠN

Nó sẽ không hiển thị các dấu phân cách!


1

Thêm mã này vào một tệp và thay đổi loại bộ sưu tập của bạn thành CustomCollectionView

import Foundation

class CustomCollectionView: UICollectionView {

  var emptyModel = EmptyMessageModel()
  var emptyView: EmptyMessageView?
  var showEmptyView: Bool = true

  override func reloadData() {
    super.reloadData()

    emptyView?.removeFromSuperview()
    self.backgroundView = nil

    if !showEmptyView {
      return
    }

    if numberOfSections < 1 {
      let rect = CGRect(x: 0,
                        y: 0,
                        width: self.bounds.size.width,
                        height: self.bounds.size.height)

      emptyView = EmptyMessageView()
      emptyView?.frame = rect
      if let emptyView = emptyView {
        //                self.addSubview(emptyView)
        self.backgroundView = emptyView
      }
      emptyView?.setView(with: emptyModel)

    } else {
      emptyView?.removeFromSuperview()
      self.backgroundView = nil
    }
  }
}

class EmptyMessageView: UIView {

  @IBOutlet weak var messageLabel: UILabel!
  @IBOutlet weak var imageView: UIImageView!

  var view: UIView!

  override init(frame: CGRect) {
    super.init(frame: frame)
    xibSetup()
  }

  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    xibSetup()
  }

  func xibSetup() {
    view = loadViewFromNib()

    view.frame = bounds

    view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    addSubview(view)
  }

  func loadViewFromNib() -> UIView {

    let bundle = Bundle(for: type(of: self))
    let nib = UINib(nibName: "EmptyMessageView", bundle: bundle)
    let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView

    return view
  }

  func setView(with model: EmptyMessageModel) {
    messageLabel.text = model.message ?? ""
    imageView.image = model.image ?? #imageLiteral(resourceName: "no_notification")
  }
}

///////////
class EmptyMessageModel {
  var message: String?
  var image: UIImage?

  init(message: String = "No data available", image: UIImage = #imageLiteral(resourceName: "no_notification")) {
    self.message = message
    self.image = image
  }
}
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.