Sobes.tech
Middle

Ինչու է ակտիվության ցուցիչը շարունակվում է աշխատել ծրագրի փակելուց հետո:

sobes.tech AI

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

Ինքնագործության պատճառը այն է, որ iOS 11-ից առաջ iOS-ում ակտիվության ցուցիչը (UIActivityIndicatorView) շարունակել է անիմացիան, նույնիսկ եթե նրա stopAnimating() մեթոդը եղել է կանչված, բայց ինքնին տեսողական կոնտրոլը կամ նրա ծնողական կոնտրոլը ամբողջությամբ չեղյալ է հայտարարվել հիշողությունից։ Ցուցիչը պարզապես դադարել է տեսողականորեն ցուցադրվել, բայց նրա ներքին վիճակը մնացել է "անիմացիոն"։

Ինքնագործության փոփոխությունից հետո, iOS 11-ից հետո, stopAnimating() իրականում դադարեցնում է անիմացիան և փոխում է ցուցիչի ներքին վիճակը։

Եթե խոսենք հին iOS տարբերակների կամ կոդում հնարավոր սխալների մասին, ապա պատճառը կարող է լինել հետևյալը:

  1. VC-ի կյանքի ցիկլի խնդիր: stopAnimating() կանչվում է ոչ բոլոր անհրաժեշտ կյանքի ցիկլի վիճակներում (օրինակ, միայն viewWillDisappear-ում, բայց ոչ viewDidDisappear-ում կամ սխալների մշակման ժամանակ):
  2. Օբյեկտի սխալ կառավարում: Ցուցիչը շարունակում է գոյություն ունենալ հիշողության մեջ և նրա վիճակը չի վերականգնվում, եթե այն չի դեալոկացվում պատշաճ կերպով կամ եթե կան ուժեղ հղումներ, որոնք խոչընդոտում են դեալոկացիային:
  3. Բազմապատկման սխալներ: stopAnimating() կանչվում է գլխավոր հոսքում, մինչդեռ UI տարրերի անիմացիաները կարելի է կառավարել միայն գլխավոր հոսքում:
// Ճիշտ կանչի օրինակ գլխավոր հոսքում
DispatchQueue.main.async {
    activityIndicator.stopAnimating()
}
  1. Ներկայացումների շղթայի խնդիր: Ներկայացումը, որը պարունակում է ցուցիչը, չի հեռացվել սուպեր-համապատկերից կամ չի թաքցվել ամբողջությամբ:
// Հեռացման օրինակ սուպեր-համապատկերից
activityIndicator.removeFromSuperview()

// Թաքցման օրինակ
activityIndicator.isHidden = true
  1. Auto Layout-ի սխալներ: Ցուցիչը շարունակում է զբաղեցնել տարածք կամ նրա չափերը չեն վերականգնվում անիմացիայի դադարեցումից հետո, ստեղծելով ակտիվության կամ ներկայության տպավորություն:

Նոր iOS տարբերակներում նման խնդիրները հազվադեպ են հանդիպում և սովորաբար կապված են օբյեկտների կյանքի ցիկլի կառավարման կամ բազմապատկման սխալների հետ։