UIActivityViewController หยุดทำงานบน iOS 8 iPads


288

ฉันกำลังทดสอบแอพของฉันด้วย Xcode 6 (เบต้า 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.

ฉันใช้รหัสต่อไปนี้สำหรับ iPhone และ iPad สำหรับทั้ง iOS 7 และ iOS 8

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

ฉันได้รับความผิดพลาดที่คล้ายกันในแอปอื่นของฉันเช่นกัน คุณช่วยแนะนำฉันได้ไหม มีการเปลี่ยนแปลงอะไรกับ UIActivityViewController ใน iOS 8? ฉันตรวจสอบแล้ว แต่ฉันไม่พบอะไรเลย


คำตอบด้านล่างทดสอบสำนวน คุณควรใช้คำตอบของ @ Galen ที่ไม่ชอบ
doozMen

คำตอบ:


462

บน iPad ตัวควบคุมมุมมองกิจกรรมจะแสดงเป็น popover โดยใช้UIPopoverPresentationControllerใหม่คุณต้องระบุจุดยึดสำหรับการนำเสนอของ popover โดยใช้หนึ่งในสามคุณสมบัติต่อไปนี้:

ในการระบุจุดยึดคุณจะต้องได้รับการอ้างอิงถึง UIPopoverPresentationController ของ UIActivityController และตั้งค่าคุณสมบัติอย่างใดอย่างหนึ่งดังนี้:

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

4
@Daljeet วิธีง่ายๆคือการวางมุมมองที่โปร่งใส 1x1 ทุกที่ที่คุณต้องการให้จุดป๊อปโอเวอร์ปรากฏและใช้มุมมองจุดยึด
Mason Cloud

3
@ ขอบคุณ mmccomb ฉันได้ใช้รหัสของคุณด้านบนมันทำงานได้ดีบน iOS 8 แต่แอปของฉันล้มเหลวใน iOS 7. ฉันได้โพสต์ปัญหาเดียวกันกับ stackoverflow ที่นี่คือลิงค์: stackoverflow.com/questions/26034149/ … ช่วยชื่นชม
Daljeet

48
@Daljeet สิ่งนี้จะขัดข้องใน iOS7 เนื่องจาก UIActivityController ไม่มีป๊อปอัพสถานที่ให้บริการการนำเสนอการควบคุมที่นั่น ใช้รหัสนี้เพื่อให้ทำงานบน iOS8 และ iOS7: if ( [activityViewController respondsToSelector:@selector(popoverPresentationController)] ) { // iOS8 activityViewController.popoverPresentationController.sourceView = _shareItem; }
bluebamboo

4
ใน iOS8, sourceRect ไม่ทำงานสำหรับฉัน ฉันต้องสร้าง souceView ด้วย rect นั้นและทำงานได้ดี
แฮร์ริส

10
@bluebamboo ทำไมคุณไม่เพิ่มคำแนะนำของคุณเพื่อแก้ไขคำตอบ มันค่อนข้างง่ายที่จะพลาดข้อมูลสำคัญของคุณในความคิดเห็นเหล่านี้
Ayush Goel

204

ปัญหาเดียวกันมาที่โครงการของฉันแล้วฉันพบวิธีแก้ปัญหาที่จะเปิดUIActivityViewControllerใน iPad ที่เราต้องใช้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 iPhone
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    [self presentViewController:controller animated:YES completion:nil];
}
//if iPad
else {
    // 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)
}

5
สำหรับไวยากรณ์ Swift "newer" UIPopoverArrowDirectionAny ควรเป็น UIPopoverArrowDirection.Any และ UIUserInterfaceIdiomPhone คือ UIUserInterfaceIdiom.Phone
EPage_Ed

1
ขอบคุณมากรวมกับความคิดเห็นของ EPage_Ed ทำงานบน XCode 7 และ SWIFT 2 ฉันได้ upvote แล้ว
Oliver Zhang

1
UIPopoverController เลิกใช้แล้วกับ iOS 9
cbartel

3
UIPopOverController เลิกใช้แล้วใน iOS 9
Leena

1
ทุกคนควรตอบด้วยวิธีนี้เพราะง่ายต่อการนำทางสำหรับคำตอบของ iOS มากกว่ารวดเร็ว .. ขอบคุณผู้ชายที่คุณทำวันนี้
MBH

42

ฉันพบปัญหาตรงนี้เมื่อเร็ว ๆ นี้ (คำถามเดิม) ใน Swift 2.0 ซึ่งใช้UIActivityViewControllerงานได้ดีกับ iPhone แต่เกิดปัญหาเมื่อทำการจำลอง iPads

ฉันต้องการเพิ่มคำตอบนี้ที่นี่อย่างน้อยใน Swift 2.0 คุณไม่จำเป็นต้องมีคำสั่ง if คุณสามารถสร้างทางpopoverPresentationControllerเลือกได้

อย่างรวดเร็วคำตอบที่ยอมรับดูเหมือนจะบอกว่าคุณอาจมีเพียง sourceView เพียง sourceRect หรือเพียง barButtonItem แต่ตามเอกสารของ Apple สำหรับ UIPopoverPresentationControllerคุณต้องการสิ่งใดสิ่งหนึ่งต่อไปนี้:

  • barButtonItem
  • sourceView และ sourceRect

ตัวอย่างเฉพาะที่ฉันทำงานอยู่ด้านล่างซึ่งฉันกำลังสร้างฟังก์ชันที่ใช้ในUIView(สำหรับ sourceView และ sourceRect) และString(กิจกรรมเดียวของ UIActivityViewControllerItItem)

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รหัสสองบรรทัดที่กล่าวถึงจะถูกละเว้น

ค่อนข้างดีที่ทุกสิ่งที่คุณต้องทำเพื่อให้มันทำงานกับไอแพดได้เพียงแค่เพิ่มโค้ดสองบรรทัดหรือเพียงแค่โค้ดเดียวถ้าคุณใช้ barButtonItem!


2
โซลูชันนี้ดูสะอาดกว่าโซลูชันอื่น ๆ ที่ต้องใช้respondsToSelectorหรือUIUserInterfaceIdiomดูเหมือนว่าจะเหมาะกับ Swift เป็นภาษาที่ดีกว่ามาก แม้ว่าrespondsToSelectorดูเหมือนว่าจะเป็นสิ่งจำเป็นสำหรับ iOS7 หากใช้ iOS เวอร์ชันที่ใหม่กว่านี้แน่นอนว่าเป็นวิธีที่จะไป
Marcus

18

ฉันเห็นผู้คนจำนวนมาก hardcoding iPhone / iPad ฯลฯ ในขณะที่ใช้รหัส Swift

ไม่จำเป็นคุณต้องใช้คุณสมบัติภาษา รหัสต่อไปนี้จะถือว่าคุณจะใช้ UIBarButtonItem และจะทำงานได้ทั้งบนiPhone และ iPad

@IBAction func share(sender: AnyObject) {
    let vc = UIActivityViewController(activityItems: ["hello"], applicationActivities: nil)
    vc.popoverPresentationController?.barButtonItem = sender as? UIBarButtonItem
    self.presentViewController(vc, animated: true, completion: nil)
 }

สังเกตว่าไม่มีคำว่า If หรือสิ่งอื่นใดที่บ้า ตัวเลือกที่เปิดใหม่จะเป็นศูนย์บน iPhone ดังนั้นสายvc.popoverPresentationController?จะไม่ทำอะไรเลยบน iPhone


มันจะดูอย่างไรในบริบทของบทช่วยสอนนี้: hackingwithswift.com/read/3/2/…
เดฟคลิมมัน

1
บทช่วยสอนไม่ได้พูดถึง popoverPresentationController ดังนั้นรหัสจะผิดพลาดบน iPad iOS 9.x วิธีแก้ไขจะเพิ่มvc.popoverPresentationController?.barButtonItem = navigationItem.rightBarButtonItemก่อนที่คุณจะแสดงตัวควบคุมมุมมอง
Martin Marconcini

สวัสดีมาร์ติน ... ฉันมีสายที่มีลักษณะเช่นนี้ในshareTapped(): vc.popoverPresentationController?.barButtonItem = sender as? UIBarButtonItemทั้งสองยังคงล้มเหลว ผมทำอะไรผิดหรือเปล่า? ในขณะที่ฉันอยู่ที่นี่ฉันจะเติม popover ด้วยบริการแชร์ต่างๆเช่น Facebook, twitter และอื่น ๆ ได้อย่างไร
Dave Kliman

และความผิดพลาดคืออะไร? คุณอาจต้องการโพสต์คำถามของคุณเอง ตรวจสอบว่าเป็นจริงsender UIBarButtonItemตรวจสอบว่า VC nilไม่ ตรวจสอบว่าคุณสามารถนำเสนอ ViewController ... โดยไม่ต้องดูที่ความผิดพลาด / รหัสยากที่จะบอก บริการจะถูกเติมโดยอัตโนมัติหากผู้ใช้มีการติดตั้งแอพ (เว้นแต่คุณจะตัดสินใจยกเว้นบางส่วน)
Martin Marconcini

1
@DaveKliman ใช่ Xcode แย่มากเมื่อพูดถึง IBOutlets และ IBActions ที่ถูกลบ / เปลี่ยนชื่อและจะหยุดทำงานเมื่อเริ่มต้น ไม่มีวิธีที่แตกต่างกันในการทำบน iOS คุณต้องใช้ Xcode และ InterfaceBuilder คุณสามารถทำสิ่งต่าง ๆ มากมาย "ในรหัส" แต่บางคนต้องการ "ลากแล้วปล่อย" Apple ต้องการให้คุณใช้สตอรีบอร์ดและ InterfaceBuilder ให้มากที่สุดเท่าที่จะเป็นไปได้ ... ลองทำความคุ้นเคยกับมัน :)
Martin Marconcini

10

โซลูชันที่ใช้ Xamarin.iOS

ในตัวอย่างของฉันฉันกำลังจับภาพหน้าจอสร้างภาพและอนุญาตให้ผู้ใช้แชร์รูปภาพ ป๊อปอัปบน iPad นั้นวางไว้กลางหน้าจอ

var activityItems = new NSObject[] { image };
var excludedActivityTypes = new NSString[] {
    UIActivityType.PostToWeibo,
    UIActivityType.CopyToPasteboard,
    UIActivityType.AddToReadingList,
    UIActivityType.AssignToContact,
    UIActivityType.Print,
};
var activityViewController = new UIActivityViewController(activityItems, null);

//set subject line if email is used
var subject = new NSString("subject");
activityViewController.SetValueForKey(NSObject.FromObject("Goal Length"), subject);

activityViewController.ExcludedActivityTypes = excludedActivityTypes;
//configure for iPad, note if you do not your app will not pass app store review
if(null != activityViewController.PopoverPresentationController)
{
    activityViewController.PopoverPresentationController.SourceView = this.View;
    var frame = UIScreen.MainScreen.Bounds;
    frame.Height /= 2;
    activityViewController.PopoverPresentationController.SourceRect = frame;
}
this.PresentViewController(activityViewController, true, null);

ขอบคุณมาก :) ทำงานร่วมกับแบบฟอร์ม Xamarin โดยใช้บริการอ้างอิง
ริคาร์โด้โรโม

7

Swift, iOS 9/10 (หลังจากเลิกใช้ UIPopoverController)

let activityViewController = UIActivityViewController(activityItems: sharingItems, applicationActivities: nil)

    if UIDevice.currentDevice().userInterfaceIdiom == .Pad {

       if activityViewController.respondsToSelector(Selector("popoverPresentationController")) {
          activityViewController.popoverPresentationController?.sourceView = self.view
        }
    }

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

3
Swift 3 ไม่สนับสนุนสิ่งนี้
Maksim Kniazev

5

ใน Swift เพื่อแก้ไขสิ่งนี้สำหรับ iPad วิธีที่ดีที่สุดคือทำสิ่งนี้ที่ฉันพบ

    let things = ["Things to share"]
    let avc = UIActivityViewController(activityItems:things, applicationActivities:nil)
    avc.setValue("Subject title", forKey: "subject")
    avc.completionWithItemsHandler = {
        (s: String!, ok: Bool, items: [AnyObject]!, err:NSError!) -> Void in
    }

    self.presentViewController(avc, animated:true, completion:nil)
    if let pop = avc.popoverPresentationController {
        let v = sender as! UIView // sender would be the button view tapped, but could be any view
        pop.sourceView = v
        pop.sourceRect = v.bounds
    }

ใช้คำตอบ @Galen ไม่น่ารำคาญสำหรับการตรวจสอบสำนวนเมื่อกำหนดเป้าหมาย iOS8 +
doozMen

5

หากคุณแสดงUIActivityViewControllerเมื่อคุณคลิกที่UIBarButtonItemใช้รหัสต่อไปนี้:

activityViewController.popoverPresentationController?.barButtonItem = sender

มิฉะนั้นถ้าคุณใช้การควบคุมอื่นตัวอย่างเช่นUIButtonใช้รหัสต่อไปนี้:

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

จากเอกสารถึงUIPopoverPresentationController:

var barButtonItem: UIBarButtonItem? { get set }

กำหนดค่าให้กับคุณสมบัตินี้เพื่อยึดป๊อปโอเวอร์กับรายการปุ่มแถบที่ระบุ เมื่อนำเสนอลูกศรของป๊อปโอเวอร์จะชี้ไปที่รายการที่ระบุ หรือคุณอาจระบุตำแหน่งจุดยึดสำหรับ popover โดยใช้คุณสมบัติ sourceView และ sourceRect


4

แก้ไขสำหรับSwift 2.0

    if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Phone {
        self.presentViewController(activityVC, animated: true, completion: nil)
    }
    else {
        let popup: UIPopoverController = UIPopoverController(contentViewController: activityVC)
        popup.presentPopoverFromRect(CGRectMake(self.view.frame.size.width / 2, self.view.frame.size.height / 4, 0, 0), inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
    }

2
UIPopoverController เลิกใช้แล้ว
LevinsonTechnologies

1
ขอบคุณ!! มันช่วยฉันได้มาก
ออสการ์

4

สวิฟท์ 3:

class func openShareActions(image: UIImage, vc: UIViewController) {
    let activityVC = UIActivityViewController(activityItems: [image], applicationActivities: nil)
    if UIDevice.current.userInterfaceIdiom == .pad {
        if activityVC.responds(to: #selector(getter: UIViewController.popoverPresentationController)) {
            activityVC.popoverPresentationController?.sourceView = vc.view
        }
    }
    vc.present(activityVC, animated: true, completion: nil)
}

3

สวิฟท์:

    let activityViewController = UIActivityViewController(activityItems: sharingItems, applicationActivities: nil)

    //if iPhone
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Phone) {
        self.presentViewController(activityViewController, animated: true, completion: nil)
    } else { //if iPad
        // Change Rect to position Popover
        var popoverCntlr = UIPopoverController(contentViewController: activityViewController)
        popoverCntlr.presentPopoverFromRect(CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/4, 0, 0), inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)

    }

2

โซลูชันสำหรับ Objective-C และด้วยการใช้ UIPopoverPresentationController

    UIActivityViewController *controller = /*Init your Controller*/;
    //if iPhone
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [self presentViewController:controller animated:YES completion:nil];
    }
    //if iPad
    else {
        UIPopoverPresentationController* popOver = controller.popoverPresentationController
        if(popOver){
            popOver.sourceView = controller.view;
            popOver.sourceRect = CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/4, 0, 0);
            [self presentViewController:controller animated:YES completion:nil];
        }
    }

1

ฉันลองรหัสถัดไปและใช้งานได้:

ก่อนอื่นให้ใส่รายการปุ่มบาร์ใน View Controller ของคุณจากนั้นสร้าง IBOutlet:

@property(weak,nonatomic)IBOutlet UIBarButtonItem *barButtonItem;

ถัดไปในไฟล์. m: yourUIActivityViewController.popoverPresentationController.barButtonItem = self.barButtonItem;


1

swift = ios7 / ios8

let activityViewController = UIActivityViewController(activityItems: sharingItems, applicationActivities: nil)

//if iPhone
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Phone) {
    // go on..
} else {
    //if iPad
    if activityViewController.respondsToSelector(Selector("popoverPresentationController")) {
        // on iOS8
        activityViewController.popoverPresentationController!.barButtonItem = self.shareButtonItem;
    }
}
self.presentViewController(activityViewController, animated: true, completion: nil)

0

ฉันพบวิธีแก้ปัญหานี้ประการแรกตัวควบคุมมุมมองของคุณที่นำเสนอ popover ควรใช้<UIPopoverPresentationControllerDelegate>โปรโตคอล

ถัดไปคุณจะต้องตั้งค่าpopoverPresentationControllerตัวแทนของ

เพิ่มฟังก์ชั่นเหล่านี้:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Assuming you've hooked this all up in a Storyboard with a popover presentation style
    if ([segue.identifier isEqualToString:@"showPopover"]) {
        UINavigationController *destNav = segue.destinationViewController;
        PopoverContentsViewController *vc = destNav.viewControllers.firstObject;

        // This is the important part
        UIPopoverPresentationController *popPC = destNav.popoverPresentationController;
        popPC.delegate = self;
    }
}

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController: (UIPresentationController *)controller {
    return UIModalPresentationNone;
}

0

ในรหัสต่อไปนี้ของ swift 4 ทำงานบน iPhone และ iPad ตามเอกสาร

มันเป็นความรับผิดชอบของคุณในการนำเสนอและยกเลิกตัวควบคุมมุมมองโดยใช้วิธีการที่เหมาะสมสำหรับสำนวนอุปกรณ์ที่กำหนด บน iPad คุณต้องแสดงตัวควบคุมมุมมองในป็อปโอเวอร์ ในอุปกรณ์อื่นคุณจะต้องนำเสนอมันอย่างสุภาพ

 let activityViewController = UIActivityViewController(activityItems: activityitems, applicationActivities: nil)

    if UIDevice.current.userInterfaceIdiom == .pad {

        if activityViewController.responds(to: #selector(getter: UIViewController.popoverPresentationController)) {
            activityViewController.popoverPresentationController?.sourceView = self.view
        }
    }

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

0

ฉันกำลังใช้ Swift 5 ฉันมีปัญหาการขัดข้องเหมือนกันเมื่อฉันคลิก "ปุ่มแชร์" ในแอพของฉันบน iPad พบวิธีแก้ปัญหานี้ ขั้นตอนที่ 1: เพิ่ม "มุมมอง" วัตถุ (ค้นหา "UIView" ในไลบรารีวัตถุ) ไปยัง Main.storyboard ขั้นตอนที่ 2: สร้าง @IBOutlet ใน ViewController.swift และกำหนดชื่อใด ๆ (เช่น: view1)

ขั้นตอนที่ 3: เพิ่มชื่อข้างต้น (เช่น: view1) เป็น sourceView นี่เป็นการกระทำ "ปุ่มแบ่งปัน" ของฉัน

@IBAction func Share(_ sender: Any) {
    let activityVC = UIActivityViewController(activityItems: ["www.google.com"], applicationActivities: nil)
    activityVC.popoverPresentationController?.sourceView = view1

    self.present(activityVC, animated: true, completion: nil)


}

ฉันใหม่มากที่จะรวดเร็วและติดอยู่กับเรื่องนี้เป็นเวลาหนึ่งสัปดาห์ หวังว่านี่จะช่วยใครซักคน ดังนั้นการแบ่งปันโซลูชันนี้


ขอบคุณมันใช้งานได้!
Jnguyen22

-1

สำหรับ Swift 2.0 ฉันพบว่ามันใช้งานได้หากคุณพยายามที่จะยึดป๊อปโอเวอร์กับปุ่มแชร์บน iPad สิ่งนี้จะถือว่าคุณได้สร้างทางออกสำหรับปุ่มแชร์ในแถบเครื่องมือของคุณ

func share(sender: AnyObject) {
    let firstActivityItem = "test"

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

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

    }
}

-5

ระวังถ้าคุณกำลังพัฒนาสำหรับ iPad โดยใช้ swift มันจะทำงานได้ดีในการดีบัก แต่จะขัดข้องในการเปิดตัว เพื่อให้สามารถใช้งานได้กับ testFlight และ AppStore ให้ปิดใช้งานการเพิ่มประสิทธิภาพสำหรับ swift ที่ใช้-noneสำหรับการเปิดตัว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.