หากไม่มีผลลัพธ์ของ Table View ให้แสดง“ No Results” บนหน้าจอ


114

ฉันมีtableviewที่ซึ่งบางครั้งอาจไม่มีผลลัพธ์ใด ๆ ให้แสดงดังนั้นฉันจึงต้องการใส่บางสิ่งที่ระบุว่า "ไม่มีผลลัพธ์"หากไม่มีผลลัพธ์ (ไม่ว่าจะเป็นป้ายกำกับหรือเซลล์มุมมองตารางเดียว)

มีวิธีที่ง่ายที่สุดในการดำเนินการนี้หรือไม่?

ฉันจะลองlabelอยู่เบื้องหลังtableviewแล้วซ่อนหนึ่งในสองบนพื้นฐานของผล แต่เนื่องจากผมทำงานด้วยTableViewControllerและไม่ปกติViewControllerผมไม่แน่ใจว่าวิธีการที่สมาร์ทหรือที่เป็นไปได้

ฉันยังใช้Parseและคลาสย่อยเป็นPFQueryTableViewController:

@interface TableViewController : PFQueryTableViewController

ฉันสามารถให้รายละเอียดเพิ่มเติมที่จำเป็นเพียงแจ้งให้เราทราบ!

TableViewController ฉากในสตอรี่บอร์ด:

ใส่คำอธิบายภาพที่นี่

แก้ไข: สำหรับ Midhun MP นี่คือรหัสที่ฉันใช้

- (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;
}

และนี่คือมุมมองที่ฉันได้รับมันยังมีเส้นคั่น ฉันรู้สึกว่านี่เป็นการเปลี่ยนแปลงเล็กน้อย แต่ฉันไม่แน่ใจว่าทำไมเส้นคั่นจึงปรากฏขึ้น?

ใส่คำอธิบายภาพที่นี่


ฉันคิดว่าเคล็ดลับคือการตั้งค่า footerView ที่ว่างเปล่าบน tableview เพื่อกำจัดเส้น
Ben Sinclair

@ แอนดี้คุณหมายความว่ายังไง?
SRMR

อย่าใช้วิธีแก้ปัญหาที่เพิ่มเข้ามาในคำถามนี้ วิธีการแหล่งข้อมูลของมุมมองตารางต้องไม่ทำเกินกว่าที่ควรจะทำ numberOfSectionsควรส่งคืนการนับและนั่นคือมัน เหมือนกันสำหรับnumberOfRowsInSection. เหล่านี้สามารถเรียกได้หลายครั้งเมื่อใดก็ได้ อย่าอัปเดตมุมมองหรืออัปเดตข้อมูลหรือทำสิ่งใด ๆ ยกเว้นส่งคืนการนับ ตรรกะสำหรับการอัปเดตมุมมองต้องไม่อยู่ในวิธีการเหล่านี้
rmaddy

คำตอบ:


206

คุณสามารถบรรลุว่าด้วยการใช้ทรัพย์สินของbackgroundViewUITableView

วัตถุประสงค์ 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;
}

สวิฟท์:

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
}

อ้างอิงการอ้างอิงคลาส UITableView

backgroundView คุณสมบัติ

มุมมองพื้นหลังของมุมมองตาราง

การประกาศ

รวดเร็ว

var backgroundView: UIView?

Objective-C

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

อภิปรายผล

มุมมองพื้นหลังของมุมมองตารางจะถูกปรับขนาดโดยอัตโนมัติเพื่อให้ตรงกับขนาดของมุมมองตาราง มุมมองนี้ถูกวางเป็นมุมมองย่อยของมุมมองตารางด้านหลังเซลล์ทั้งหมดมุมมองส่วนหัวและมุมมองส่วนท้าย

คุณต้องตั้งค่าคุณสมบัตินี้เป็นศูนย์เพื่อตั้งค่าสีพื้นหลังของมุมมองตาราง


ขอบคุณสำหรับคำตอบ! นี่หมายความว่าฉันต้องการtableViewเต้าเสียบเพื่อที่ฉันจะได้ทำyourTableView.backgroundView? ฉันกำลังใช้TableViewControllerดังนั้นฉันจึงไม่มีเต้าเสียบในตอนนี้นั่นคือเหตุผลที่ฉันสงสัย
SRMR

1
UITableViewControllerมีสถานที่ให้บริการอยู่แล้วtableViewดังนั้นคุณไม่จำเป็นต้องสร้าง
Cihan Tek

รับทราบโดยใช้self.tableView
SRMR

1
การแก้ไข ในการทดสอบเพิ่มเติมฉันต้องทำให้บรรทัดที่ฉันพูดถึงส่งคืนค่าเดียวกัน numOfSections = 1 ถ้าฉันทำให้เป็นศูนย์และมุมมองตารางของฉันว่างเปล่ามันจะใช้งานได้ แต่เมื่อฉันสร้างเซลล์แล้วลบออกแทนที่จะลบและแสดงข้อความมันขัดข้องด้วยข้อผิดพลาดต่อไปนี้ *** การยุติแอปเนื่องจากข้อยกเว้น 'NSInternalInconsistencyException' ที่ไม่ถูกจับสาเหตุ: 'ข้อผิดพลาดภายใน UITableView: ไม่สามารถสร้างแผนที่ส่วนใหม่ด้วยจำนวนส่วนเก่า: 1 และจำนวนส่วนใหม่: 0' ฉันไม่รู้ว่าทำไมการคืนค่าเดิมถึงได้ผล แต่มันทำและได้ผลตามที่ควร
ChrisOSX

2
อย่าใช้วิธีนี้ วิธีการแหล่งข้อมูลของมุมมองตารางต้องไม่ทำเกินกว่าที่ควรจะทำ numberOfSectionsควรส่งคืนการนับและนั่นคือมัน เหมือนกันสำหรับnumberOfRowsInSection. เหล่านี้สามารถเรียกได้หลายครั้งเมื่อใดก็ได้ อย่าอัปเดตมุมมองหรืออัปเดตข้อมูลหรือทำสิ่งใด ๆ ยกเว้นส่งคืนการนับ ตรรกะสำหรับการอัปเดตมุมมองต้องไม่อยู่ในวิธีการเหล่านี้
rmaddy

107

สำหรับ Xcode 8.3.2 - Swift 3.1

ต่อไปนี้เป็นวิธีที่ไม่ค่อยเป็นที่รู้จัก แต่ง่ายอย่างไม่น่าเชื่อในการเพิ่มมุมมอง "ไม่มีรายการ" ไปยังมุมมองตารางว่างที่กลับไปที่ Xcode 7 ฉันจะปล่อยให้คุณควบคุมตรรกะที่เพิ่ม / ลบ ดูมุมมองพื้นหลังของตาราง แต่นี่คือโฟลว์สำหรับและ Xcode (8.3.2) storyboard:

  1. เลือกฉากใน Storyboard ที่มีมุมมองตารางของคุณ
  2. ลาก UIView ที่ว่างเปล่าไปที่ "Scene Dock" ของฉากนั้น

ใส่คำอธิบายภาพที่นี่

  1. เพิ่ม UILabel และข้อ จำกัด ใด ๆ ในมุมมองใหม่จากนั้นสร้าง IBOutlet สำหรับมุมมองนั้น

ใส่คำอธิบายภาพที่นี่

  1. กำหนดมุมมองนั้นให้กับ tableView.backgroundView

ใส่คำอธิบายภาพที่นี่

  1. ดูมายากล!

ใส่คำอธิบายภาพที่นี่

ท้ายที่สุดแล้วสิ่งนี้ใช้ได้ทุกเมื่อที่คุณต้องการเพิ่มมุมมองแบบธรรมดาให้กับตัวควบคุมมุมมองของคุณซึ่งคุณไม่จำเป็นต้องแสดงทันที แต่คุณก็ไม่ต้องการส่งรหัสด้วยมือ


1
เทคนิคนี้ใช้ได้กับทุกสิ่งที่คุณต้องการมุมมองง่ายๆ ฉันยังใช้สำหรับส่วนหัวของตารางแบบกำหนดเอง จริงๆแล้วคุณสามารถใช้สำหรับทุกสิ่งที่คุณต้องการดู เพียงอ้างอิงผ่าน IBOutlet และเพิ่มเป็นมุมมองย่อยที่ใดก็ได้ที่คุณต้องการมุมมองที่กำหนดเอง
Paul Bonneville

อย่างที่ @gmogames กล่าวไว้ว่าหลังจากทำ IOS มา 2 ปีนี่เป็นครั้งแรกที่รู้เกี่ยวกับพื้นหลัง tableView! ขอบคุณมาก
Ali Adil

1
ขอบคุณสำหรับสิ่งนี้. ฉันต้องใช้ tableView.separatorStyle = .none และปรับขนาด UIView เริ่มต้นเพื่อดู backgroundView ฉันใช้ Xcode 9.4 กับ Swift 4
Hammad Tariq

คุณวางมุมมองแบบกำหนดเองได้อย่างไร?
Nol4635

1
@ Nol4635 ในกรณีของพื้นหลัง tableview คุณเพียงแค่กำหนดมุมมองที่คุณสร้างขึ้นเป็น IBOutlet ให้กับพื้นหลังของ tableview หรือหากคุณต้องการเพิ่มมุมมองในมุมมองอื่นคุณสามารถเพิ่มเป็นมุมมองย่อยได้ คุณจะต้องกำหนดค่าเฟรม แต่ก็เหมือนกับมุมมองอื่น ๆ
Paul Bonneville

30

เวอร์ชัน Swift ของโค้ดด้านบน: -

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
}

แต่หากคุณกำลังโหลดข้อมูลจาก JSON คุณต้องตรวจสอบว่า JSON ว่างเปล่าหรือไม่ดังนั้นหากคุณใส่โค้ดแบบนี้ในตอนแรกจะแสดงข้อความ "ไม่มีข้อมูล" จากนั้นจะหายไป เนื่องจากหลังจากตารางโหลดข้อมูลซ้ำข้อความจะซ่อน ดังนั้นคุณสามารถใส่รหัสนี้ที่โหลดข้อมูล JSON ไปยังอาร์เรย์ ดังนั้น: -

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
    })
}

วิธีนี้ใช้ได้ดีมากสำหรับการแสดงป้ายกำกับเมื่อไม่มีข้อมูลอยู่ในแถว อย่างไรก็ตามวิธีที่ดีที่สุดในการจัดการเมื่อข้อมูลเข้ามาและself.tableView.reloadData()ถูกเรียกใช้คืออะไร? ฉันพบว่ามันกำลังเพิ่มแถวใหม่ของฉัน แต่noDataLabelยังคงแสดงอยู่ข้างใต้
tylerSF

1
หากอาร์เรย์ของคุณมีรายการเพียงแค่ตั้งค่า self.tableView.backgroundView = nil
Chathuranga Silva

if jobs_list.count == 0 {// add above given code} else {self.tableView.backgroundView = nil}
Chathuranga Silva

สมบูรณ์ การเพิ่มself.tableView.backgroundView = nilคำสั่ง if ของฉันก่อนจะreturn jobs_list.count ทำงานได้ดี ขอบคุณ
tylerSF

อย่าใช้วิธีแก้ปัญหาแรกในคำตอบนี้ วิธีการแหล่งข้อมูลของมุมมองตารางต้องไม่ทำเกินกว่าที่ควรจะทำ numberOfSectionsควรส่งคืนการนับและนั่นคือมัน เหมือนกันสำหรับnumberOfRowsInSection. เหล่านี้สามารถเรียกได้หลายครั้งเมื่อใดก็ได้ อย่าอัปเดตมุมมองหรืออัปเดตข้อมูลหรือทำสิ่งใด ๆ ยกเว้นส่งคืนการนับ ตรรกะสำหรับการอัปเดตมุมมองต้องไม่อยู่ในวิธีการเหล่านี้
rmaddy

6

คุณสามารถลองใช้การควบคุมนี้ มันค่อนข้างเรียบร้อย DZNEmptyDataSet

หรือถ้าฉันเป็นคุณทั้งหมดฉันจะทำก็คือ

  • ตรวจสอบว่าอาร์เรย์ข้อมูลของคุณว่างเปล่า
  • หากว่างเปล่าให้เพิ่มออบเจ็กต์หนึ่งชื่อ @ "ไม่มีข้อมูล" เข้าไป
  • แสดงสตริงนั้นใน cell.textLabel.text

peasy ง่าย


5

Swift 3 (อัพเดท):

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
}

อย่าใช้วิธีนี้ วิธีการแหล่งข้อมูลของมุมมองตารางต้องไม่ทำเกินกว่าที่ควรจะทำ numberOfSectionsควรส่งคืนการนับและนั่นคือมัน เหมือนกันสำหรับnumberOfRowsInSection. เหล่านี้สามารถเรียกได้หลายครั้งเมื่อใดก็ได้ อย่าอัปเดตมุมมองหรืออัปเดตข้อมูลหรือทำสิ่งใด ๆ ยกเว้นส่งคืนการนับ ตรรกะสำหรับการอัปเดตมุมมองต้องไม่อยู่ในวิธีการเหล่านี้
rmaddy

ฉันเห็นด้วย. โซลูชันนี้สามารถปรับปรุงได้ แต่ก็สามารถใช้ได้เช่นกัน
Teodor Ciuraru

คุณจะตกลงได้อย่างไรว่าคุณไม่ควรใช้โซลูชันนี้ แต่จากนั้นระบุว่าสามารถใช้ได้ด้วย? นั่นเป็นความขัดแย้ง
rmaddy

ฉันยอมรับว่าโซลูชันนี้สามารถปรับปรุงได้ แต่ในสถานะปัจจุบันจะใช้งานได้เช่นกัน
Teodor Ciuraru

5

Swift3.0

ฉันหวังว่ามันจะเป็นเซิร์ฟเวอร์ตามวัตถุประสงค์ของคุณ ...... ใน UITableViewController ของคุณ

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
        }
    }
}

Helper Class พร้อมฟังก์ชั่น:

 /* 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;
        }

อย่าใช้วิธีนี้ วิธีการแหล่งข้อมูลของมุมมองตารางต้องไม่ทำเกินกว่าที่ควรจะทำ numberOfSectionsควรส่งคืนการนับและนั่นคือมัน เหมือนกันสำหรับnumberOfRowsInSection. เหล่านี้สามารถเรียกได้หลายครั้งเมื่อใดก็ได้ อย่าอัปเดตมุมมองหรืออัปเดตข้อมูลหรือทำสิ่งใด ๆ ยกเว้นส่งคืนการนับ ตรรกะสำหรับการอัปเดตมุมมองต้องไม่อยู่ในวิธีการเหล่านี้
rmaddy

3

ฉันคิดว่าวิธีที่ดีที่สุดในการแก้ปัญหาของคุณคือการเปลี่ยนจากUITableViewControllerไฟล์UIViewControllerไฟล์UITableView. ด้วยวิธีนี้คุณสามารถเพิ่มสิ่งที่UIViewคุณต้องการเป็นมุมมองย่อยของมุมมองหลัก

ฉันไม่แนะนำให้ใช้ UITableViewCell เพื่อทำสิ่งนี้คุณอาจต้องเพิ่มสิ่งต่างๆเพิ่มเติมในอนาคตและสิ่งต่างๆอาจทำให้น่าเกลียดได้อย่างรวดเร็ว

คุณสามารถทำสิ่งนี้ได้เช่นกัน แต่นี่ไม่ใช่วิธีที่ดีที่สุดเช่นกัน

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

ขอขอบคุณสำหรับสีรอบ ๆ ซึ่งเป็นวิธีที่สวยงามที่สุดในการนำไปใช้เป็นวิธีที่ดีในการคิดเสมอ ฉันอาจลองเปลี่ยนสตอรี่บอร์ดของฉันเพื่อใช้UIViewControllerไฟล์UITableView.
SRMR

1
นั่นเป็นวิธีพิสูจน์อนาคตที่สุด ฉันไม่เคยใช้UITableViewControllerตัวเองเลยเพราะการใช้มันไม่ง่ายไปกว่าการทำแบบอื่น แต่มันจำกัดความสามารถของคุณในการเปลี่ยนแปลงสิ่งต่างๆในอนาคต
Cihan Tek

สิ่งนี้ไม่สามารถพิสูจน์ได้ในอนาคตหากคุณมีแท่งโปร่งแสง ฉันขอแนะนำให้ต่อต้าน อย่างน้อยที่สุดให้สร้าง UIViewController ที่มี UITableViewController และปรับสิ่งต่างๆให้เหมาะสม
xtravar

3

ใช้รหัสนี้ในnumberOfSectionsInTableViewวิธีการของคุณ: -

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
อย่าใช้วิธีนี้ วิธีการแหล่งข้อมูลของมุมมองตารางต้องไม่ทำเกินกว่าที่ควรจะทำ numberOfSectionsควรส่งคืนการนับและนั่นคือมัน เหมือนกันสำหรับnumberOfRowsInSection. เหล่านี้สามารถเรียกได้หลายครั้งเมื่อใดก็ได้ อย่าอัปเดตมุมมองหรืออัปเดตข้อมูลหรือทำสิ่งใด ๆ ยกเว้นส่งคืนการนับ ตรรกะสำหรับการอัปเดตมุมมองต้องไม่อยู่ในวิธีการเหล่านี้
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

หากคุณไม่ได้ใช้ส่วนท้าย tableview และไม่ต้องการให้ tableview เต็มหน้าจอด้วยเซลล์ตารางเริ่มต้นที่ว่างเปล่าฉันขอแนะนำให้คุณตั้งค่าส่วนท้าย tableview ของคุณเป็น UIView ที่ว่างเปล่า ฉันไม่รู้ไวยากรณ์ที่ถูกต้องในการทำสิ่งนี้ใน obj-c หรือ Swift แต่ใน Xamarin.iOS ฉันจะทำเช่นนี้:

public class ViewController : UIViewController
{
    UITableView _table;

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

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

        _table.TableFooterView = new UIView();
    }
}

โค้ดด้านบนจะส่งผลให้ tableview ไม่มีเซลล์ว่าง


2

นี่คือวิธีแก้ปัญหาที่เหมาะกับฉัน

  1. เพิ่มรหัสต่อไปนี้ในไฟล์ใหม่

  2. เปลี่ยนคลาสตารางของคุณเป็นคลาสที่กำหนดเอง "MyTableView" จากสตอรี่บอร์ดหรือ. xib

(จะใช้ได้กับส่วนแรกเท่านั้นหากคุณต้องการปรับแต่งเพิ่มเติมให้ทำการเปลี่ยนแปลงในฟังก์ชัน MyTableView reloadData () ตามส่วนอื่น ๆ )

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
            }
        }
    }
}

นี่เป็นแนวทางที่ดี ฉันได้เพิ่มการปรับปรุงบางอย่างดังต่อไปนี้เพื่อให้กลมได้ดียิ่งขึ้น 1. รูปแบบตัวคั่นแคชของ tableview และเรียกคืนเมื่อเปลี่ยนสถานะว่าง / ไม่ว่างเพื่อทำให้คลาสย่อยนี้ใช้ได้กับกรณีการใช้งานที่ต้องการสไตล์ตัวคั่นที่แตกต่างกัน 2. เพิ่ม@IBInspectable var emptyStateText: String?และทำเครื่องหมายชั้นเรียนนี้@IBDesignableจากนั้นคุณจะสามารถเปลี่ยนข้อความสถานะว่างที่แตกต่างกันสำหรับฉากต่างๆในกระดานเรื่องราวหรือ xibs สนุก! :)
Egist Li

1

ฉันจะนำเสนอมุมมองภาพซ้อนทับที่มีรูปลักษณ์และข้อความที่คุณต้องการหาก tableview ไม่มีผลลัพธ์ คุณสามารถทำได้ใน ViewDidAppear ดังนั้นคุณจึงมีผลลัพธ์ก่อนที่จะแสดง / ไม่แสดงมุมมอง


1

หากคุณต้องการทำสิ่งนี้โดยไม่ต้องใช้รหัสใด ๆ ลองสิ่งนี้!

คลิกที่ tableView ของคุณ

ภาพหน้าจอ tableView

เปลี่ยนรูปแบบจาก "ธรรมดา" เป็น "จัดกลุ่ม"

ภาพหน้าจอคุณสมบัติ Table View-2

ตอนนี้เมื่อคุณใช้ ....

tableView.backgroundView = ใส่ LABEL หรือ VIEW ของคุณ

มันจะไม่แสดงตัวคั่น!


1

เพิ่มรหัสนี้ในไฟล์เดียวและเปลี่ยนประเภทคอลเล็กชันของคุณเป็น 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
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.