Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.
0 oy
1.1k kez görüntülendi
ios development kategorisinde tarafından
tarafından düzenlendi
Uygulamamdaki bir ViewController'de yer alan paylaş butonuna dokunulunca özel bir ShareViewController açılıyor ve facebook, twetter vs butonlar gözüküyor. Bu butonlardan herhangi birine dokunulunca, açılan bu ShareViewController'in dismiss olmasını istiyorum. Bunun için de aşağıdaki kodu*  kullanıyorum.

Ancak dokunulan ve presentViewController ile açılacak olan pencere de dismiss oluyor. Sadece ShareViewController'ün dismiss olup açılacak social ekranın görünmesini nasıl sağlayabilirim?

* dismissViewControllerAnimated(true, completion: nil)
 
ShareViewController içinde yer alan örnek paylaşım butonlarından birinin kodları şu şekilde:

https://gist.github.com/burhanaksendir/5253d780c50f45b7910e

1 cevap

+1 oy
tarafından
tarafından seçilmiş
 
En İyi Cevap

shareViewController'da paylaşım butonunua baıldığında öncelikle viewController'ı dismiss et ve completion block'un içerisinde SLComposeViewController'ı present et.

şöyle yani;

self.dismissViewControllerAnimated(true, completion: { () -> Void in
            if SLComposeViewController.isAvailableForServiceType(SLServiceTypeFacebook){
                var facebookSheet: SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeFacebook)
                facebookSheet.setInitialText("Demo")
                self.presentViewController(facebookSheet, animated: true, completion: nil)

            }
        })
tarafından
Teşekkür ederim. ShareViewController içinde söylediğiniz gibi yaptım ancak şöyle bir hata alıyorum:
- Warning: Attempt to present <SLComposeViewController: 0x7a0d2e50> on ShareViewController: 0x79fc2ca0> whose view is not in the window hierarchy!
tarafından
Bu hata sizde oluyor mu ?
tarafından
hmm, ne yapmıştım burda hatırlamıyorum.   :D
yarın bir bakarım.
tarafından
:) Soru yağmuruna tuttum; haklısınız hatırlamamakla. Ama gerçekten minnettarım yardımlarınız için. Eksik olmayın.

Sizinle bu problemi yaşadığım örnek bir proje paylaşıyorum:
https://drive.google.com/file/d/0B94geQNpqygPVzdMc0t2SW11YjdFa0dBXzZ2ZXQ1WVZ0dUdV/view?usp=sharing

Teşekkürler.
tarafından
+1
tamam şimdi anladım mevzuyu,
viewcontroller hiyerarşisine aykırı bir şey yapmak istiyorsunuz, bu nedenle istediğinizi yapabilmek için notification kullanmak uygun olur.


öncelikle,

ShareViewController içerisinde faceBookShare aksiyonunu şu şekilde düzenleyelim.
bu viewController içerisinde facebook paylaşım sayfamızı açmayacağız çünkü viewController'ı önce dismiss edeceğiz.

@IBAction func facebookShare(sender: AnyObject) {
        self.dismissViewControllerAnimated(true, completion: { () -> Void in
            NSNotificationCenter.defaultCenter().postNotificationName("facebookShareTrigerNotification", object: nil)
        })
    }


facebook paylaşım sayfamızı  mevcut shareViewControoller'ımızı dismiss ettikten sonra parentViewcontroller olan detailViewController'içerisinde gerçekleştirmemiz gerek Bunun için yukarıda görebileceğiniz dismiss animasyonu completion block'u içerisinde bir notification post ediyorum ve hemen detailViewController'da viewDidLoad metodu içerisine bu notification'u alabilecek bir listener ekliyorum.


NSNotificationCenter.defaultCenter().addObserver(self, selector: "initiateFacebookShareView", name: "facebookShareTrigerNotification", object: nil)


bu listener'ı initiateFacebookShareView aksiyonuna bağlıyorum.


func initiateFacebookShareView() {
        if SLComposeViewController.isAvailableForServiceType(SLServiceTypeFacebook){
            var facebookSheet: SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeFacebook)
            facebookSheet.setInitialText("Özel paylaşım ekranı açık kalsın.")
            self.presentViewController(facebookSheet, animated: true, completion: nil)
        } else {
            var alert = UIAlertController(title: nil, message: "Facebook cihazınızda aktif değil. Ayarlardan paylaşım için aktifleştiriniz.", preferredStyle: UIAlertControllerStyle.Alert)
            alert.addAction(UIAlertAction(title: "Tamam", style: UIAlertActionStyle.Default, handler: nil))
            self.presentViewController(alert, animated: true, completion: nil)
        }
    }


ve initiateFacebookShareView aksiyonu içerisinde  SLComposeViewController'ı facebook paylaşımı için initiate ediyorum.


bu sayede kullanıcı shareViewController içerisinde facebook butonuna dokunduğunda shareViewController animated olarak kapatılacak ve daha sonra faceBook paylaşım ekranı açılacak.

istediğiniz de buydu sanırım değilmi.
tarafından
Evet, aynen buydu. Çok teşekkür ederim. İşi ustasından öğrenmek ayrı bir güzel. Sonsuz teşekkürler.
tarafından
tarafından düzenlendi
Tekrar merhaba,
addObserver  yaptıktan sonra nerede removeObserver yapmalıyız acaba ?

Ben şöyle düşündüm,   detailViewController'da:

override func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(animated)
        NSNotificationCenter.defaultCenter().removeObserver(self, name: "facebookShareTrigerNotification", object: nil)
    }

yanlışsa düzeltin lütfen.
tarafından
+1
controller'lar için viewWillDisappear metodu içerisinde yapabilirsiniz.
tarafından
bir de merak ettiğim diğer konu ise şu:
@IBAction func facebookShare her dokunulduğunda sistem bir NSNotificationCenter.defaultCenter().addObserver mi oluşturacak yeniden ? Yoksa zaten var deyip es mi geçecek ?
tarafından
+1
hayır facebookShare aksiyonu içerisinde bir notification post ediyoruz NSNotificationCenter.defaultCenter().postNotificationName'i kullanarak.

NSNotificationCenter.defaultCenter().addObserver'ıysa
viewDidLoad metodu içerisine tanımlıyoruz zaten yani bir kere ekleniyor ve notification'ları dinlemeye başlıyor.
siz yeni bir notification post ettiğinizde addObserver'ı yeniden tanımlanması gibi bir durum söz konusu değil yani.
tarafından
Teşekkür ederim. Şimdi daha iyi anladım.
...