Popover hala görünür durumdayken UIPopovercontroller dealloc'a ulaşıldı


111

Sizi temin ederim ki sorum için SO'da bir cevap aradım ama hiçbiri yardımcı olmadı. Burada a UIImagePickerControlleriçinde sunması gereken basit bir kod var UIPopoverController:

-(void)takePicture:(id)sender{
UIImagePickerController *picker=[[UIImagePickerController alloc] init];
picker.delegate=self;
picker.sourceType=UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing=YES;
UIPopoverController *poc=[[UIPopoverController alloc] 
                            initWithContentViewController:picker];
[poc presentPopoverFromBarButtonItem:bbItem 
            permittedArrowDirections:UIPopoverArrowDirectionAny
                            animated:NO];
}

Şimdi, ilk kez [UIPopoveController dealloc]ulaştığımda bile ... hatası ve program çöküyor. ARC uyarınca herhangi bir saklama, yeniden yayınlama veya otomatik yayınlama yapmıyorum. UIPopoverControllersARC'den faydalanırken özel bir husus var mı ?

Yanıtlar:


203

UIPopoverControllers her zaman bir örnek değişkeninde tutulmalıdır. Bunun için güçlü bir mülk oluşturmak iyi bir uygulamadır.

GÜNCELLEME:

İOS 8'den itibaren kullanmanız gerekir UIPopoverPresentationController. Ardından, açılır bilgi penceresine bir referans tutmanıza gerek kalmaz çünkü bu, sunum denetleyicisi tarafından yönetilir.

Kod örneği (hem iPhone hem de iPad'de çalışır):

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing = YES;
picker.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController* popoverPC = picker.popoverPresentationController;
popoverPC.barButtonItem = bbItem;
popoverPC.permittedArrowDirections = UIPopoverArrowDirectionAny;
[self presentViewController:picker animated:YES completion:nil];

1
Ah anlıyorum. Ama bu bir UIAlertView gibi değil mi? Asla bir ivar'ım yok, sadece ihtiyacım olan yere yerleştiriyorum, gösteriyorum ve sonra [eskiden] serbest bırakıyorum. Popovercontroller'ın farkı nedir?
Mikayil Abdullayev

17
@Mikayil alertView, süpervizyonu tarafından tutulur (tüm görünümler olduğu gibi), ancak popoverController bir görünüm değildir, bu nedenle bir süpervizyona sahip değildir, bu nedenle, onu tutmazsanız kimse tarafından tutulmaz (veya mevcut yöntemden daha uzun bir kapsamı olan güçlü bir değişkende saklayın - örneğin bir iVar).
fzwo

1
Ama yine de UIPopoverController'ın tutma sayısı konusunda kafam karıştı. Çünkü bir çek tahsis edip koymadan önce bir çek koyuyorum. Ve sadece sıfır olursa, yeni bir tane ayırırım. Ama onu ilk kez tahsis ettikten sonra asla sıfır alamıyorum. Demek istediğim, bir kez bir yöntem çağırıyorum. Orada ivarımı tahsis eder ve başlatırım. Ve bir dahaki sefere bu yöntemi tekrar çağırdığımda, bu sefer ivarımı zaten tahsis edilmiş buluyorum. ARC bununla ilgilenirse, ne zaman serbest bırakır? Yoksa otomatik olarak serbest bırakıyor mu?
Mikayil Abdullayev

@Mikayil ivars, nesne serbest bırakıldığında veya sıfıra ayarladığınızda ARC tarafından serbest bırakılır
Felix

ancak dokümantasyonda bundan bahsetmediler, Nasıl Kullanılır bölümünde yerel değişken kullanıyorlar
Amit Battan

11

İşlevden çıktığında, açılır pencere denetleyicisine başka bir başvuru yoktur, bu nedenle çok erken kaldırılır.

Bunun yerine sınıfınızın bir üyesi olarak eklemeyi deneyin.

Tim


Ayrılmadan önce onu yine de görebilmem gerekmez mi?
Mikayil Abdullayev

10

@ Phix23 yanıtını ekleyerek, * poc özelliğini şu şekilde oluşturun:

@property (nonatomic, retain) IBOutlet UIPopoverController *poc;

ve sonra değiştir

UIPopoverController *poc = [[UIPopoverController alloc] 
                            initWithContentViewController:picker];

için

self.poc = [[UIPopoverController alloc] 
                            initWithContentViewController:picker];

11
.H dosyanıza koymanız gerekmez. Bu, onu herkese açık hale getirir ve istemediğiniz sürece .m dosyanızda bir özellik yapın.
Joshua Dance
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.