Sobes.tech
Junior

Ինչպես լուծել սյունակների կամ հավաքածուների մեջ բջիջների կրկնակի օգտագործման խնդիրը?

sobes.tech AI

Պատասխան AI-ից

UITableView և UICollectionView-ում բջջի կրկնակի օգտագործման խնդիրն կապված է այն բանի հետ, որ սիստեմը սլայքի ժամանակ օգտագործում է այն բջիջները, որոնք դուրս են եկել տեսանելի տարածքից, նոր բովանդակություն ցուցադրելու համար: Եթե բջիջը նախապես ճիշտ պատրաստված չէ, այն կարող է ցուցադրել հին տվյալներ կամ սխալ վիճակ:

Ելքը հետևյալն է:

  1. Բջջի գրանցում: Նախքան օգտագործելը, այն պետք է գրանցել կրկնակի օգտագործման համար որոշակի նույնականացուցիչով:

    // `UITableView`-ի համար
    tableView.register(MyCustomCell.self, forCellReuseIdentifier: "MyCellIdentifier")
    
    // `UICollectionView`-ի համար
    collectionView.register(MyCustomCell.self, forCellWithReuseIdentifier: "MyCellIdentifier")
    

    Սա թույլ է տալիս համակարգին արդյունավետ կառավարել կրկնակի օգտագործվող բջիջների պուլը:

  2. Կրկնակի օգտագործվող բջջի ստացում: tableView(_:cellForRowAt:) կամ collectionView(_:cellForItemAt:) մեթոդներում անհրաժեշտ է խնդրել գրանցված նույնականացուցիչով բջիջ:

    // `UITableView`-ի համար
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "MyCellIdentifier", for: indexPath) as? MyCustomCell else {
        fatalError("Անհաջողվեց ստանալ MyCustomCell") // տեսակի ստուգմամբ
    }
    
    // `UICollectionView`-ի համար
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCellIdentifier", for: indexPath) as? MyCustomCell else {
        fatalError("Անհաջողվեց ստանալ MyCustomCell") // տեսակի ստուգմամբ
    }
    

    dequeueReusableCell(withIdentifier:for:) մեթոդները կամ վերադարձնում են գոյություն ունեցող կրկնակի օգտագործվող բջիջը, կամ ստեղծում նոր, եթե պուլը դատարկ է:

  3. Բջջի կարգավորում: Բջիջը ստանալուց հետո անհրաժեշտ է ճիշտ տվյալներ սահմանել ընթացիկ indexPath-ի համար:

    // `cellForRowAt` կամ `cellForItemAt`-ում
    let data = dataArray[indexPath.row] // Տվյալների օրինակ
    cell.configure(with: data) // Բջջի կարգավորման մեթոդի կանչ
    
  4. prepareForReuse() մեթոդը: Կարգավորեք prepareForReuse() մեթոդը բջջի հատուկ դասում, որպեսզի այն մաքրի կամ վերականգնի բջջի վիճակը նախքան այն կրկնակի օգտագործման պուլին ավելացնելը:

    // `MyCustomCell` դասում
    override func prepareForReuse() {
        super.prepareForReuse()
        // UI տարրերի վերականգնում
        imageView.image = nil
        titleLabel.text = nil
        // Ասինխրոն գործառույթների չեղարկում
        cancelAsyncTask()
        // Վիճակների վերականգնում
        someSwitch.isOn = false
    }
    

    Սա ապահովում է, որ հաջորդ օգտագործման ժամանակ բջիջը սկսում է մաքուր վիճակից, առանց նախորդ ցուցադրության ժառանգության:

Ամենակարևորն է, որ բջջի բոլոր կողմերը (տեքստային դաշտեր, պատկերներ, գույներ, ընտրված վիճակներ և այլն) կարգավորվեն ընթացիկ indexPath-ի տվյալների հիման վրա, և չպետք է հենվել նախորդ օգտագործված բջջի վիճակի վրա: