2015-02-12 7 views
9

के साथ UITableViewCell Subclass मेरे पास UITableViewCell उपclass NameInput है जो कस्टम init विधि के साथ xib से कनेक्ट होता है।XIB स्विफ्ट

class NameInput: UITableViewCell { 

    class func make(label: String, placeholder: String) -> NameInput { 

     let input = NSBundle.mainBundle().loadNibNamed("NameInput", owner: nil, options: nil)[0] as NameInput 

     input.label.text = label 
     input.valueField.placeholder = placeholder 
     input.valueField.autocapitalizationType = .Words 

     return input 
    } 

} 

वहाँ एक रास्ता मैं viewDidLoad विधि में इस सेल को प्रारंभ कर सकते हैं और अभी भी यह पुन: उपयोग है? या क्या मुझे कक्षा को खुद को पुन: उपयोग पहचानकर्ता के साथ पंजीकृत करना है?

उत्तर

53

प्रथागत निब प्रक्रिया है:

  1. पुन: उपयोग पहचानकर्ता के साथ अपने निब रजिस्टर। स्विफ्ट 3 में:

    override func viewDidLoad() { 
        super.viewDidLoad() 
    
        tableView.register(UINib(nibName: "NameInput", bundle: nil), forCellReuseIdentifier: "Cell") 
    } 
    

    स्विफ्ट 2 में:

    override func viewDidLoad() { 
        super.viewDidLoad() 
    
        tableView.registerNib(UINib(nibName: "NameInput", bundle: nil), forCellReuseIdentifier: "Cell") 
    } 
    
  2. परिभाषित करें अपने कस्टम सेल वर्ग:

    import UIKit 
    
    class NameInput: UITableViewCell { 
    
        @IBOutlet weak var firstNameLabel: UILabel! 
        @IBOutlet weak var lastNameLabel: UILabel! 
    
    } 
    
  3. (इंटरफ़ेस बिल्डर में एक निब फ़ाइल बनाएँ एक ही नाम संदर्भित साथ चरण 1 में):

    • अपने कस्टम सेल क्लास (चरण 2 में परिभाषित) का संदर्भ देने के लिए एनआईबी में टेबलव्यू सेल का बेस क्लास निर्दिष्ट करें।

    • कस्टम सेल क्लास में @IBOutlet संदर्भों में एनआईबी में सेल में नियंत्रण के बीच संदर्भों को हुक अप करें।

  4. आपका cellForRowAtIndexPath तो सेल का दृष्टांत और लेबल सेट होगा।

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! NameInput 
    
        let person = people[indexPath.row] 
        cell.firstNameLabel.text = person.firstName 
        cell.lastNameLabel.text = person.lastName 
    
        return cell 
    } 
    

    स्विफ्ट 2 में: स्विफ्ट 3 में

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! NameInput 
    
        let person = people[indexPath.row] 
        cell.firstNameLabel.text = person.firstName 
        cell.lastNameLabel.text = person.lastName 
    
        return cell 
    } 
    

मैं पूरी तरह अपने उदाहरण है कि आप अपने सेल पर रखा नियंत्रित करता है से यकीन नहीं था, लेकिन इसके बाद के संस्करण दो UILabel नियंत्रण हैं। हुक अप जो भी @IBOutlet संदर्भ आपके ऐप के लिए समझ में आता है।

+0

ठीक समझते हैं मूल रूप से मैं अलग सेल उपवर्गों के साथ विभिन्न महत्वपूर्ण व्यक्ति के बहुत सारे है। इंडेक्स पथ विधि के साथ पंक्ति के लिए सेल में मैं विभिन्न उप-वर्गों से निपटने के बारे में कैसे जाउंगा? उनमें से प्रत्येक के पास अलग-अलग क्षेत्र होते हैं। – jamespick

+1

ठीक है, मान लें कि आपके पास 50 पंक्तियां होंगी, लेकिन कहें, तीन मूलभूत प्रकार के सेल कॉन्फ़िगरेशन हैं। तो बस उन तीन एनआईबी/एक्सआईबी पंजीकृत करें, जिनमें से प्रत्येक अपने स्वयं के पुन: उपयोग पहचानकर्ता के साथ। फिर 'cellForRowAtIndexPath',' row' और '' NSIndexPath' की section', सेल के प्रकार के लिए उचित सेल पहचानकर्ता विपंक्ति, और उसके बाद के आधार पर उचित रूप में खानों को भरने जाएगा। – Rob

+0

Fwiw, मैं वास्तव में लगता है स्टोरीबोर्ड में सेल प्रोटोटाइप के साथ काम थोड़ा आसान है। आपको अलग-अलग एनआईबी फाइलों से निपटने की ज़रूरत नहीं है और सब कुछ ठीक है।लेकिन जो भी आप अधिक आरामदायक हैं उसका उपयोग करें। – Rob

3

आप viewDidLoad में सेल्स प्रारंभ नहीं करते हैं। आपको अपने टेबल व्यू के साथ कक्षा में नहीं, XIB पंजीकृत करना चाहिए। आपको tableView:cellForRowAtIndexPath: में संभावित रूप से NameInput पर एक उदाहरण विधि कॉल करके लेबल और टेक्स्ट फ़ील्ड सेट अप करना चाहिए)।

+1

धन्यवाद haha ​​Ive थोड़ी देर के लिए अपने जवाब घूर कर दिया गया लेकिन अब मैं धन्यवाद – jamespick

 संबंधित मुद्दे