मैं संपत्ति "सेलव्यूमोडेल" को सामान्य के रूप में चाहता हूं ताकि मैं विभिन्न प्रकार के मॉडल के साथ बेस कस्टमसेल का पुन: उपयोग कर सकूं। उदा.

 struct CELLVIEWMODEL {
   var name: String
   var address: String
 }
 class BaseCustomCell: UITableViewCell {
       var cellViewModel: CELLVIEWMODEL  //should support different model types CELLVIEWMODEL1,CELLVIEWMODEL2
       {
        didSet() {
          setValuesInSubClasses
        }
      }
      func setValuesInSubClasses() {
       //subclass will implement
      }
 }

 class subCell: BaseCustomCell {
     override func setValuesInSubClasses() {
       //set value from cellViewModel
      }
 }

// इस प्रकार मैं cellForRowAtIndexPath विधि से सेटिंग कर रहा हूं:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: viewModel.getCellId(), for: indexPath) as! BaseCustomCell
        cell.cellViewModel = viewModel.getCellModelAtIndexPath(indexPath) //this will set values for subclasses
        return cell
    }

अब, मैं विभिन्न प्रकार के सेल व्यू मॉडेल के लिए हर बार नया बेस कस्टमसेल बना रहा हूं। क्या आप किसी समाधान में मदद कर सकते हैं?

1
Avijit Nagare 22 सितंबर 2020, 11:20

1 उत्तर

सबसे बढ़िया उत्तर

अपने लक्ष्यों को प्राप्त करने के कई तरीके हैं।

आप वास्तविक BaseCustomCell ग्लास को सामान्य बना सकते हैं, लेकिन सावधान रहें यदि आप स्टोरीबोर्ड का उपयोग करते हैं, तो यह कोई समाधान नहीं है, क्योंकि आपको स्टोरीबोर्ड में जेनेरिक प्रकार को हार्डकोड करना होगा।

स्टोरीबोर्ड के साथ काम करने वाला दूसरा समाधान भी आपके व्यूमोडेल को प्रोटोकॉल के रूप में घोषित करना है, फिर आप इसे प्रोटोकॉल के किसी भी ठोस कार्यान्वयन से बदल सकते हैं।

protocol CellViewModel {
    var name: String { get }
    var address: String { get }
}

class BaseCustomCell: UITableViewCell {
    var cellViewModel: CellViewModel {
        didSet() {
            setValuesInSubClasses
        }
    }
    
    func setValuesInSubClasses() {
       //subclass will implement
    }
}

class SubCell: BaseCustomCell {
     override func setValuesInSubClasses() {
       //set value from cellViewModel
      }
 }

और फिर आपके viewModel.getCellModelAtIndexPath का रिटर्न प्रकार CellViewModel होना चाहिए, ताकि यह प्रोटोकॉल के अनुरूप किसी भी प्रकार को वापस कर सके।

तो आपको बस अपने ठोस सेल व्यू मॉडल जैसे class FirstCellViewModel: CellViewModel { ... }, आदि घोषित करने की आवश्यकता है और आप उन्हें getCellModelAtIndexPath से वापस कर सकते हैं।

1
Dávid Pásztor 22 सितंबर 2020, 08:55