यदि कोई तालिका दृश्य परिणाम नहीं है, तो स्क्रीन पर "कोई परिणाम नहीं" प्रदर्शित करें


114

मेरे पास एक है tableview, जहां कभी-कभी सूची देने के लिए कोई परिणाम नहीं हो सकता है, इसलिए मैं कुछ ऐसा कहना चाहूंगा जो "कोई परिणाम नहीं" कहता है यदि कोई परिणाम नहीं हैं (या तो एक लेबल या एक टेबल व्यू सेल?)।

क्या ऐसा करने का एक आसान तरीका है?

मैं परिणामों के आधार पर दोनों में से एक को छिपाने के labelपीछे कोशिश करूंगा tableview, लेकिन जब से मैं एक के साथ काम कर रहा हूं TableViewControllerऔर सामान्य ViewControllerनहीं हूं, मुझे यकीन नहीं है कि यह कितना स्मार्ट या उल्लेखनीय है।

मैं भी उपयोग कर रहा हूँ Parseऔर एक के रूप में उपवर्ग PFQueryTableViewController:

@interface TableViewController : PFQueryTableViewController

मैं कोई भी अतिरिक्त विवरण प्रदान कर सकता हूं, बस मुझे बताएं!

TableViewController स्टोरीबोर्ड में दृश्य:

यहां छवि विवरण दर्ज करें

EDIT: प्रति मिडहैन सांसद, यहां वह कोड है जिसका मैं उपयोग कर रहा हूं

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

और यहाँ मुझे जो व्यू मिल रहा है, उसमें अभी भी विभाजक रेखाएँ हैं। मुझे लग रहा है कि यह कुछ छोटा बदलाव है, लेकिन मुझे यकीन नहीं है कि विभाजक रेखाएं क्यों दिखाई दे रही हैं?

यहां छवि विवरण दर्ज करें


मुझे लगता है कि ट्रिक लाइनों से छुटकारा पाने के लिए टेबलव्यू पर खाली फुटवेयर देखने के लिए थी।
बेन सिनक्लेयर

@ और क्या आप इसका क्या मतलब है?
SRMR

इस प्रश्न में जोड़े गए समाधान का उपयोग न करें। टेबल व्यू डेटा सोर्स मेथड्स को कभी भी ऐसा नहीं करना चाहिए जो वे करने वाले हैं। numberOfSectionsएक गिनती लौटानी चाहिए और वह यह है। उसी के लिए numberOfRowsInSection। इन्हें किसी भी समय कई बार कहा जा सकता है। गणना को वापस करने के अलावा कभी भी अपडेट या डेटा अपडेट न करें या कुछ भी न करें। विचारों को अपडेट करने का तर्क इन तरीकों में कभी नहीं होना चाहिए।
उपद्रव

जवाबों:


206

की backgroundViewसंपत्ति का उपयोग करके आप इसे आसानी से प्राप्त कर सकते हैं UITableView

उद्देश्य सी:

- (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?

उद्देश्य सी

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

विचार-विमर्श

तालिका दृश्य का आकार देखने के लिए तालिका दृश्य की पृष्ठभूमि दृश्य स्वचालित रूप से आकार बदल जाती है। यह दृश्य सभी कक्षों, शीर्ष लेख दृश्य और पाद दृश्य के पीछे तालिका दृश्य के उप-भाग के रूप में रखा गया है।

तालिका दृश्य की पृष्ठभूमि का रंग सेट करने के लिए आपको यह गुण सेट करना होगा।


जवाब के लिए धन्यवाद! क्या इसका मतलब tableViewहै कि मुझे एक आउटलेट की आवश्यकता है ताकि मैं कर सकूं yourTableView.backgroundView? मैं एक का उपयोग कर रहा हूँ TableViewControllerतो मैं अभी इसके लिए एक आउटलेट नहीं है, यही कारण है कि मैं सोच रहा हूँ।
SRMR

1
UITableViewControllerपहले से ही आपके पास एक संपत्ति है, tableViewइसलिए आपको
सिहान Tek

समझे, का उपयोग करself.tableView
SRMR

1
भूल सुधार। आगे के परीक्षण के बाद, मुझे वास्तव में उस लाइन को बनाना पड़ा जिसका उल्लेख मैंने उसी मूल्य पर किया। numOfSections = 1. यदि मैं इसे शून्य बनाता हूं और मेरी तालिका दृश्य रिक्त है, तो यह काम करता है, लेकिन जब मैं एक सेल बनाता हूं और फिर इसे हटाता हूं, तो संदेश को हटाने और दिखाने के बजाय, यह निम्न त्रुटि के साथ क्रैश होता है। *** अनकहा अपवाद 'NSInternalInconsistencyException' अपवाद के कारण समाप्ति ऐप, कारण: 'UITableView आंतरिक बग: पुराने अनुभाग की गणना के साथ एक नया अनुभाग मानचित्र बनाने में असमर्थ: 1 और नया अनुभाग गणना: 0'। मुझे नहीं पता कि समान मान वापस करना क्यों काम करता है, लेकिन यह काम करता है और इसे कैसे करना चाहिए।
क्रिसओएसएक्स

2
इस घोल का उपयोग न करें। टेबल व्यू डेटा सोर्स मेथड्स को कभी भी ऐसा नहीं करना चाहिए जो वे करने वाले हैं। numberOfSectionsएक गिनती लौटानी चाहिए और वह यह है। उसी के लिए numberOfRowsInSection। इन्हें किसी भी समय कई बार कहा जा सकता है। गणना को वापस करने के अलावा कभी भी अपडेट या डेटा अपडेट न करें या कुछ भी न करें। विचारों को अपडेट करने का तर्क इन तरीकों में कभी नहीं होना चाहिए।
rmaddy

107

Xcode 8.3.2 के लिए - स्विफ्ट 3.1

यहाँ एक खाली टेबल दृश्य में "नो आइटम" दृश्य जोड़ने के लिए एक बहुत ही जाना-पहचाना लेकिन अविश्वसनीय रूप से आसान तरीका है, जो कि Xcode 7 पर वापस जाता है। मैं इसे आपको उस तर्क को नियंत्रित करने के लिए छोड़ दूंगा जो जोड़ता / हटाता है तालिका की पृष्ठभूमि को देखने के लिए, लेकिन यहाँ और Xcode (8.3.2) स्टोरीबोर्ड के लिए प्रवाह है:

  1. स्टोरीबोर्ड में वह दृश्य चुनें, जिसमें आपका टेबल व्यू है।
  2. उस दृश्य के "दृश्य डॉक" के लिए एक खाली UIView खींचें

यहां छवि विवरण दर्ज करें

  1. नए दृश्य में एक UILabel और कोई बाधा जोड़ें और फिर उस दृश्य के लिए एक IBOutlet बनाएं

यहां छवि विवरण दर्ज करें

  1. उस दृश्य को tableView.backgroundView पर असाइन करें

यहां छवि विवरण दर्ज करें

  1. जादू देखो!

यहां छवि विवरण दर्ज करें

अंतत: यह कभी भी काम करता है आप अपने दृश्य नियंत्रक में एक साधारण दृश्य जोड़ना चाहते हैं जिसे आप तुरंत प्रदर्शित नहीं करना चाहते हैं, लेकिन यह भी कि आप कोड को हाथ नहीं लगाना चाहते हैं।


1
यह तकनीक ऐसी किसी भी चीज़ के लिए काम करती है, जिसके लिए आपको एक सरल दृष्टिकोण की आवश्यकता होती है। मैंने इसका उपयोग कस्टम टेबल सेक्शन हेडर के लिए भी किया है। वास्तव में, आप इसे किसी भी चीज़ के लिए उपयोग कर सकते हैं जिसके लिए आपको एक दृश्य की आवश्यकता है। बस एक IBOutlet के माध्यम से संदर्भ और इसे सबव्यू के रूप में जोड़ें कहीं भी आपको एक कस्टम दृश्य की आवश्यकता है।
पॉल बोनेविले

जैसा कि @gmogames ने कहा, 2 साल के लिए IOS करने के बाद टेबल व्यू बैकग्राउंड के बारे में यह पहली बार पता चला है। धन्यवाद आदमी
अली आदिल

1
इसके लिए धन्यवाद। बस इसे वहाँ लगाने के लिए, मुझे tableView.separatorStyle = .none का उपयोग करना पड़ा और पृष्ठभूमि देखने के लिए डिफ़ॉल्ट UIView का आकार बदलना पड़ा। मैं स्विफ्ट 4 के साथ Xcode 9.4 का उपयोग कर रहा हूं
हम्माद तारिक

आप कस्टम दृश्य कैसे रखते हैं?
Nol4635

1
@ Nol4635 टेबलव्यू बैकग्राउंड के मामले में, आप सिर्फ उस व्यू को असाइन करते हैं, जिसे आप एक IBOutlet के रूप में टेबलव्यू के बैकग्राउंड में बनाते हैं या, यदि आप किसी अन्य व्यू में सिर्फ व्यू जोड़ना चाहते हैं, तो आप इसे सबव्यू के रूप में जोड़ सकते हैं। आपको फ्रेम मान सेट करना होगा, लेकिन यह किसी भी अन्य दृश्य की तरह है।
पॉल बोनेविले

30

उपरोक्त कोड का स्विफ्ट संस्करण: -

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
चतुरंगा सिल्वा

if jobs_list.count == 0 {// ऊपर दिए गए कोड को जोड़ें} और {self.tableView.backgroundView = nil}
चतुरंगा सिल्वा

उत्तम। अच्छी तरह self.tableView.backgroundView = nilसे return jobs_list.countकाम करने से पहले अगर मेरे बयान में जोड़ना । धन्यवाद
tylerSF

इस उत्तर में पहले हल का उपयोग न करें। टेबल व्यू डेटा सोर्स मेथड्स को कभी भी ऐसा नहीं करना चाहिए जो वे करने वाले हैं। numberOfSectionsएक गिनती लौटानी चाहिए और वह यह है। उसी के लिए numberOfRowsInSection। इन्हें किसी भी समय कई बार कहा जा सकता है। गणना को वापस करने के अलावा कभी भी अपडेट या डेटा अपडेट न करें या कुछ भी न करें। विचारों को अपडेट करने का तर्क इन तरीकों में कभी नहीं होना चाहिए।
उपद्रव

6

आप इस नियंत्रण की कोशिश कर सकते हैं। यह बहुत साफ है। DZNEmptyDataSet

या अगर मैं तुम सब होता तो मैं क्या करता

  • यह देखने के लिए जांचें कि क्या आपका डेटा ऐरे खाली है
  • यदि यह खाली है, तो इसमें @ "डेटा नहीं" नामक एक ऑब्जेक्ट जोड़ें
  • उस स्ट्रिंग को cell.textLabel.text में प्रदर्शित करें

बहुत आसान


5

स्विफ्ट 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। इन्हें किसी भी समय कई बार कहा जा सकता है। गणना को वापस करने के अलावा कभी भी अपडेट या डेटा अपडेट न करें या कुछ भी न करें। विचारों को अपडेट करने का तर्क इन तरीकों में कभी नहीं होना चाहिए।
उपद्रव

मैं सहमत हूँ। इस समाधान में सुधार किया जा सकता है, लेकिन इसका उपयोग भी किया जा सकता है।
तियोदोर सियारू

आप इस बात से कैसे सहमत हो सकते हैं कि आपको इस समाधान का उपयोग नहीं करना चाहिए लेकिन फिर उस अवस्था का भी उपयोग किया जा सकता है? यह एक विरोधाभास है।
'13

मैं मानता हूं कि इस समाधान में सुधार किया जा सकता है, लेकिन, इसकी वर्तमान स्थिति में भी, काम करेगा।
तियोदोर सियारू

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

समारोह के साथ सहायक श्रेणी:

 /* 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खुद का उपयोग नहीं किया है , क्योंकि इसका उपयोग करना वास्तव में इसे दूसरे तरीके से करने की तुलना में बहुत आसान नहीं है, फिर भी यह भविष्य में चीजों को बदलने की आपकी क्षमता को सीमित करता है।
सिहान टेक

यदि आपके पास पारभासी पट्टियाँ हैं, तो यह भविष्य का प्रमाण नहीं है। मैं अत्यधिक के खिलाफ सलाह देते हैं। बहुत कम से कम, एक 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

स्विफ्ट 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

यदि आप टेबलव्यू फुटर का उपयोग नहीं करते हैं और नहीं चाहते कि टेबलव्यू स्क्रीन को खाली डिफॉल्ट टेबल सेल से भर दे तो मैं आपको सुझाव दूंगा कि आप अपने टेबलव्यू फुटर को एक खाली यूआईवीयूवी में सेट करें। मुझे ओबज-सी या स्विफ्ट में ऐसा करने के लिए सही सिंटैक्स नहीं पता है, लेकिन 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();
    }
}

उपरोक्त कोड के परिणामस्वरूप रिक्त कक्षों के बिना एक टेबलव्यू होगा


2

यहाँ समाधान है कि मेरे लिए काम किया है।

  1. नई फ़ाइल में निम्न कोड जोड़ें।

  2. अपनी टेबल क्लास को स्टोरीबोर्ड या .xib से कस्टम क्लास "MyTableView" में बदलें

(यह केवल पहले खंड के लिए काम करेगा। यदि आप अधिक अनुकूलित करना चाहते हैं, तो 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. टेबलव्यू की कैश विभाजक शैली और इसे खाली / गैर-खाली राज्य संक्रमण पर बहाल करें ताकि यह उपवर्ग उपयोग के मामलों के लिए लागू हो सके जो अलग विभाजक शैली वांछित हैं। 2. @IBInspectable var emptyStateText: String?इस वर्ग को जोड़ें और चिह्नित करें, @IBDesignableतब आप स्टोरीबोर्ड या xibs में अलग-अलग दृश्यों के लिए अलग-अलग खाली स्टेट टेक्स्ट को बदल पाएंगे। का आनंद लें! :)
एगिस्ट ली

1

मैं एक ओवरले दृश्य प्रस्तुत करूंगा जिसमें वह दृश्य और संदेश है जो आप चाहते हैं यदि टेबलव्यू का कोई परिणाम नहीं है। आप इसे ViewDidAppear में कर सकते हैं, इसलिए आपके पास दृश्य दिखाने / न दिखाने से पहले परिणाम हैं।


1

यदि आप इसे बिना किसी कोड के करना चाहते हैं, तो यह कोशिश करें!

अपने tableView पर क्लिक करें।

तालिका दृश्य स्क्रीनशॉट

शैली को "सादे" से "समूहीकृत" में बदलें।

तालिका देखें गुण स्क्रीनशॉट -2

अब जब आप उपयोग करेंगे ...।

tableView.backgroundView = अपना लेबल या दृश्य सम्मिलित करें

यह विभाजकों को नहीं दिखाएगा!


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
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.