亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

UIActivityViewController在iOS 8 iPad上崩潰

UIActivityViewController在iOS 8 iPad上崩潰

Helenr 2019-09-19 09:12:12
我目前正在使用Xcode 6(Beta 6)測試我的應用程序。UIActivityViewController可與iPhone設備和模擬器配合使用,但與iPad模擬器和設備(iOS 8)崩潰并帶有以下日志Terminating app due to uncaught exception 'NSGenericException', reason: 'UIPopoverPresentationController (<_UIAlertControllerActionSheetRegularPresentationController: 0x7fc7a874bd90>) should have a non-nil sourceView or barButtonItem set before the presentation occurs.我正在為iOS 7和iOS 8使用以下iPhone和iPad代碼NSData *myData = [NSData dataWithContentsOfFile:_filename];NSArray *activityItems = [NSArray arrayWithObjects:myData, nil];UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:nil applicationActivities:nil];activityViewController.excludedActivityTypes = @[UIActivityTypeCopyToPasteboard];[self presentViewController:activityViewController animated:YES completion:nil];我也得到了一個類似的崩潰我的其他應用程序。你能指導我嗎?iOS 8中的UIActivityViewController有什么變化嗎?我查了但是我沒有找到任何關于此的內容
查看完整描述

3 回答

?
九州編程

TA貢獻1785條經驗 獲得超4個贊

在iPad上,活動視圖控制器將使用新的UIPopoverPresentationController顯示為彈出窗口,它要求您使用以下三個屬性之一為彈出窗口的表示指定錨點:

為了指定錨點,您需要獲取對UIActivityController的UIPopoverPresentationController的引用,并設置其中一個屬性,如下所示:

if ( [activityViewController respondsToSelector:@selector(popoverPresentationController)] ) { // iOS8
 activityViewController.popoverPresentationController.sourceView =parentView;
 }


查看完整回答
反對 回復 2019-09-19
?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

同樣的問題來到我的項目然后我找到解決方案,在iPad中打開UIActivityViewController,我們必須使用UIPopoverController

這是一個在iPhone和iPad上使用它的代碼

//to attach the image and text with sharing UIImage *image=[UIImage imageNamed:@"giraffe.png"];NSString *str=@"Image form My app";NSArray *postItems=@[str,image];UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:postItems applicationActivities:nil];//if iPhoneif (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    [self presentViewController:controller animated:YES completion:nil];}//if iPadelse {
    // Change Rect to position Popover
    UIPopoverController *popup = [[UIPopoverController alloc] initWithContentViewController:controller];
    [popup presentPopoverFromRect:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/4, 0, 0)inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];}

對于swift 4.2 / swift 5

func openShareDilog() {
    let text = "share text will goes here"

    // set up activity view controller
    let textToShare = [text]
    let activityViewController = UIActivityViewController(activityItems: textToShare, applicationActivities: nil)
    activityViewController.excludedActivityTypes = [.airDrop]

    if let popoverController = activityViewController.popoverPresentationController {
        popoverController.sourceRect = CGRect(x: UIScreen.main.bounds.width / 2, y: UIScreen.main.bounds.height / 2, width: 0, height: 0)
        popoverController.sourceView = self.view
        popoverController.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
    }

    self.present(activityViewController, animated: true, completion: nil)}


查看完整回答
反對 回復 2019-09-19
?
四季花海

TA貢獻1811條經驗 獲得超5個贊

我最近在Swift 2.0中遇到了這個確切的問題(原始問題),這UIActivityViewController對于iPhone來說效果很好,但在模擬iPad時會導致崩潰。

我只想在這里添加這個答案的線程,至少在Swift 2.0中,你不需要if語句。你可以popoverPresentationController選擇。

快速地說,接受的答案似乎是說你可以只有一個sourceView,只是一個sourceRect,或者只是一個barButtonItem,但根據Apple的UIPopoverPresentationController文檔,你需要以下之一:

  • barButtonItem

  • sourceView  sourceRect

我正在研究的特定示例如下所示,我正在創建一個函數,它接受一個UIView(對于sourceView和sourceRect)和String(UIActivityViewController唯一的activityItem)。

func presentActivityViewController(sourceView: UIView, activityItem: String ) {

    let activityViewController = UIActivityViewController(activityItems: [activityItem], applicationActivities: [])

    activityViewController.popoverPresentationController?.sourceView = sourceView
    activityViewController.popoverPresentationController?.sourceRect = sourceView.bounds

    self.presentViewController(activityViewController, animated: true, completion: nil)}

這段代碼適用于iPhone和iPad(我認為甚至是tvOS) - 如果設備不支持popoverPresentationController,提到它的兩行代碼基本上都被忽略了。

有點好,你需要做的就是讓它適用于iPad只需要添加兩行代碼,或者如果你使用的是barButtonItem就可以添加一行代碼!


查看完整回答
反對 回復 2019-09-19
  • 3 回答
  • 0 關注
  • 1401 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號