110

Sizi sorduğum cevabın bir cevabını aradığımı ama hiçbirinin yardımcı olmadığına dair sizi temin ederim. Hatta ben [UIPopoveController dealloc] ulaştı ... hata ve program çöküyor olsun ilk andan itibaren, ŞimdiUIPopovercontroller dealloc popover hala görünürken ulaşıldı

-(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]; 
} 

: İşte bir UIImagePickerControllerUIPopoverController bir dahilinde sunmalıdır basit kodu var. ARC'ye göre herhangi bir rehine, relase veya autoreleases yapıyorum. ARC'den faydalanırken UIPopoverControllers ile herhangi bir özel değerlendirme var mı?

cevap

203

UIPopoverControllers hep bir örnek değişkeninde düzenlenmeli. Bunun için güçlü bir özellik yaratmak iyi bir uygulamadır.

GÜNCELLEME:

iOS 8'in olarak, UIPopoverPresentationController kullanıyor olmalıdır. Ardından, sunum denetleyicisi tarafından yönetildiği için popover'a bir başvuru tutmanıza gerek yoktur.

Kod örneği (iPhone ve iPad'de hem ç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

Oh, anlıyorum. Ama bu bir UIAlertView gibi değil mi? Bunun için hiçbir zaman bir ivarım yok, sadece ihtiyacım olan yere, onu göstermeye ve sonra serbest bırakmaya başladım. Popovercontroller farklı nedir? –

+17

@Mikayil warningViewView süper görünümüyle (tüm görünümler içindeyse) korunur, ancak popoverController bir görünüm değildir, bu nedenle süper bir görüşü yoktur, bu nedenle eğer siz onu saklamıyorsanız hiç kimse tarafından saklanmayacaktır (veya geçerli yöntemden daha uzun bir kapsamı olan güçlü bir değişkende saklayın - örneğin bir iVar). – fzwo

+1

Ama hala UIPopoverController koruma sayısı hakkında kafam karıştı. Çünkü ben tahsis etmeden ve bir tanesine başlamadan önce bir çek koyuyorum. Ve sadece, eğer yenilmezse, yeni bir tane tahsis ederim. Ama ilk kez tahsis ettikten sonra asla sıfırlamam. Demek istediğim, bir keresinde bir yöntem çağırırım. Orada tahsis ettim ve ivarımı başlattım. Ve bir dahaki sefere bu yöntemi tekrar aradığımda, bu sefer ivar'ım zaten ayrılmış durumda. Eğer ARC bununla ilgilenirse, o zaman ne zaman serbest bırakır. Yoksa bunu otomatikleştiriyor mu? –

11

İşlevden çıkış yapıldığında, popover denetleyicisine başka bir gönderme yapılmaz, dolayısıyla çok erken ayrılır.

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

Tim

+0

Hala ayrılmadan önce onu görememeli miyim? –

10

ekleme phix23 cevap @, * böyle poc özellik oluşturmak neyi:

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

ve sonra değiştirmek

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

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

kullanıyorsunuz .h dosyasına koymak için. Bu onu kamuoyuna yapar ve bunu istemezseniz, sadece .m dosyanızda bir özellik haline getirin. –

+0

iOS 7'de de aynı sorun vardı ve bu çözümü çözdüm. – dobiho

İlgili konular