2016-04-12 3 views
1

Я представляю контроллер активности на iPhone по этому пути:UIActivityViewController автоматически закрывается

let shareText = track.name 
    let shareUrl = NSURL(string: "https://api.test.com/" 
    let shareVC = UIActivityViewController(activityItems: [shareText, shareUrl], applicationActivities: nil) 
    self.presentViewController(shareVC, animated: true, completion: nil) 

У меня есть UITabbarC -> UINavigationC -> UIViewC -> представлены модально UINavigationC -> UIViewC -> открытие UIActivityViewC отсюда. Он открывается без проблем, но когда я нажимаю приложение электронной почты, например, он отображается около 0,5-1 секунды и автоматически закрывается.

Кто-нибудь знает, в чем причина и как это исправить?

+0

Я не вижу вопрос. –

ответ

0

Вы должны представить UIActivityViewController в своем верхнем или последнем контроллере представления. Это может быть, например, navigationController ..

Вы не указали структуру проекта путем вы можете попробовать, например:

if let vc = self.parentViewController { 
    let shareText = track.name 
    let shareUrl = NSURL(string: "https://api.test.com/" 
    let shareVC = UIActivityViewController(activityItems: [shareText, shareUrl], applicationActivities: nil) 
    shareVC.setValue(shareText, forKey: "subject") 
    vc.presentViewController(shareVC, animated: true, completion: nil) 
} 

Если проблема сохраняется, также посмотреть эти строки, если вы тестирования на IPad :

При представлении контроллера вида вы должны сделать это, используя соответствующие средства для текущего устройства. На iPad вы должны представить контроллер просмотра в popover. На iPhone и iPod touch вы должны представить его модально.

if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Phone { 
     self.presentViewController(shareVC, animated: true, completion: nil) 
    } 
    else {    
     if activityViewController.respondsToSelector("popoverPresentationController") { 
      activityViewController.popoverPresentationController!.barButtonItem = sender as? UIBarButtonItem 
      self.presentViewController(shareVC, animated: true, completion: nil) 
     } 

    } 

Попробуйте сделать тест с:

let shareText: String! = "Hello" 
let shareurl: NSURL! = NSURL(string: "http://www.google.com") 

(этот тест, потому что я хочу, чтобы исключить какие-либо проблемы вокруг вашего HTTPS URL-адрес, utf8 кодировке и некоторые странности вокруг shareText)

Чтобы запомнить: Согласно форуму Apple here:

Симулятор не поддерживает почту. Вероятно, вам следует попробовать проверить функцию на устройстве.

Update: Чтобы изолировать проблему почты, попробуйте использовать этот класс:

import Foundation 
import UIKit 
import MessageUI 

class ViewController: UIViewController, MFMailComposeViewControllerDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    @IBAction func sendEmailButtonTapped(sender: AnyObject) { 
     let mailComposeViewController = configuredMailComposeViewController() 
     if MFMailComposeViewController.canSendMail() { 
      self.presentViewController(mailComposeViewController, animated: true, completion: nil) 
     } else { 
      self.showSendMailErrorAlert() 
     } 
    } 

    func configuredMailComposeViewController() -> MFMailComposeViewController { 
     let mailComposerVC = MFMailComposeViewController() 
     mailComposerVC.mailComposeDelegate = self // Extremely important to set the --mailComposeDelegate-- property, NOT the --delegate-- property 

     mailComposerVC.setToRecipients(["[email protected]"]) 
     mailComposerVC.setSubject("Sending you an in-app e-mail...") 
     mailComposerVC.setMessageBody("Sending e-mail in-app is not so bad!", isHTML: false) 

     return mailComposerVC 
    } 

    func showSendMailErrorAlert() { 
     let sendMailErrorAlert = UIAlertView(title: "Could Not Send Email", message: "Your device could not send e-mail. Please check e-mail configuration and try again.", delegate: self, cancelButtonTitle: "OK") 
     sendMailErrorAlert.show() 
    } 

    // MARK: MFMailComposeViewControllerDelegate Method 
    func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!) { 
     controller.dismissViewControllerAnimated(true, completion: nil) 
    } 
} 

Как использовать, например:

var emailTitle = "Feedback" 
var messageBody = "Feature request or bug report?" 
var toRecipients = ["[email protected]", "[email protected]"] 
var mc:MFMailComposeViewController = MFMailComposeViewController() 

mc.mailComposeDelegate = self 

mc.setSubject(emailTitle) 
mc.setMessageBody(messageBody, isHTML: false) 
mc.setToRecipients(toRecipients) 

Некоторые подробности и обсуждение here ..

+0

Все еще не работает. Добавлена ​​структура вида – Viktor

+0

Я добавил код, посмотрите сейчас, если у вас есть iPad (в вашем вопросе вы не укажете свой тип устройства) –

+0

Я пользуюсь iPhone .. – Viktor

0

Моя структура представлений UITabbar C -> UINavigationC -> UIViewC1 -> представленный в режиме UINavigationC -> UIViewC2

Когда я вызываю UIActivityViewController из UIViewC2 (который представлен по методу UIViewC1), я описал проблему.

Но когда я закрыл UIViewC2 перед показом UIActivityViewController - это работает

Мое решение:

Добавлена ​​underController переменная UIViewC2 и установить его вручную перед UIVIewC2 представления

let shareVC = UIActivityViewController(activityItems: [shareText, shareUrl], applicationActivities: nil) 

self.dismissViewControllerAnimated(true) { 
    self.underController?.presentViewController(shareVC, animated: true, completion: nil) 
} 
Смежные вопросы