ইউআইএসিটিভিটিভিউ কনট্রোলার আইওএস 8 আইপ্যাডে ক্র্যাশ করছে


288

আমি বর্তমানে আমার অ্যাপটি এক্সকোড 6 (বিটা 6) দিয়ে পরীক্ষা করছি। ইউআইএসিএটিভিটিভিউ কনট্রোলার আইফোন ডিভাইস এবং সিমুলেটরগুলির সাথে দুর্দান্ত কাজ করে তবে আইপ্যাড সিমুলেটর এবং ডিভাইসগুলির (আইওএস 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.

আমি আইওএস 7 এর পাশাপাশি আইওএস 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];

আমি আমার অন্য অ্যাপ্লিকেশনটিতেও একইরকম ক্রাশ পাচ্ছি। আপনি আমাকে গাইড করতে পারেন? আইওএস 8-এ ইউআইএসিটিভিটিভিউ কনট্রোলারের সাথে কিছু পরিবর্তন হয়েছে? আমি চেক করেছিলাম কিন্তু আমি এ বিষয়ে কিছুই পাইনি


প্রতিমাটির পরীক্ষার নীচে উত্তরগুলি। আপনার @ গ্যালেনের উত্তরটি ব্যবহার করা উচিত যা তা নয়।
doozMen

উত্তর:


462

আইপ্যাডে অ্যাক্টিভিটি ভিউ কন্ট্রোলারটিকে নতুন ইউআইপিপওভারপ্রেজেশন কনট্রোলার ব্যবহার করে পপওভার হিসাবে প্রদর্শিত হবে , এর জন্য আপনাকে নীচের তিনটি বৈশিষ্ট্যের মধ্যে একটি ব্যবহার করে পপওভার উপস্থাপনের জন্য একটি অ্যাঙ্কার পয়েন্ট নির্দিষ্ট করতে হবে:

অ্যাঙ্কার পয়েন্ট নির্দিষ্ট করার জন্য আপনাকে ইউআইএসিটিভিটি কনট্রোলারের ইউআইপিপভারপ্রেমেশনেশন কন্ট্রোলারের একটি রেফারেন্স পেতে হবে এবং নিম্নলিখিত বৈশিষ্ট্যগুলির মধ্যে একটি নির্ধারণ করতে হবে:

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

4
@ দলজিৎ একটি সহজ উপায় হ'ল আপনি যেখানেই পপওভারের পয়েন্টটি উপস্থিত হতে চান সেখানে 1x1 স্বচ্ছ দৃষ্টিভঙ্গি স্থাপন করবেন এবং এটিকে অ্যাঙ্কর ভিউ হিসাবে ব্যবহার করুন।
ম্যাসন মেঘ

3
উপরে এটি iOS 8 কাজ করে জরিমানা @Thanks mmccomb, আমি আপনার কোড প্রয়োগ করেছেন, কিন্তু আইওএস 7.I আমার অ্যাপ্লিকেশন ক্র্যাশ Stackoverflow এখানে একটি একই সমস্যা পোস্ট করেছেন লিঙ্ক: stackoverflow.com/questions/26034149/... সাহায্যের প্রশংসা করা হয়
দলজিৎ

48
@ ডালজিৎ এটি আইওএস 7-এ ক্র্যাশ করবে কারণ ইউআইএসিটিভিটি কনট্রোলারের কোনও সম্পত্তি পপওভারপ্রেজেশন কনট্রোলার নেই। এই আইওএস 8 এবং আইওএস 7 এ কাজ করতে এই কোডটি ব্যবহার করুন: if ( [activityViewController respondsToSelector:@selector(popoverPresentationController)] ) { // iOS8 activityViewController.popoverPresentationController.sourceView = _shareItem; }
ব্লু বাঁশ

4
আইওএস 8-এ, উত্সরেক্ট আমার পক্ষে কাজ করে নি। আমাকে সেই রেক্টর সাথে একটি স্যুসভিউ তৈরি করতে হয়েছিল এবং এটি দুর্দান্ত কাজ করেছে।
হ্যারিস

10
@ ব্লুবাম্বু কেন আপনি নিজের পরামর্শটি উত্তরে সম্পাদনা হিসাবে যুক্ত করবেন না? এই মন্তব্যগুলিতে আপনার গুরুত্বপূর্ণ তথ্যটি মিস করা মোটামুটি সহজ।
আয়ুশ গোয়েল

203

একই সমস্যাটি আমার প্রকল্পে এসেছিল তখন আমি সমাধানটি খুললাম যে এটি খুলতে হবে UIActivityViewController আমাদের ব্যবহার করতে হবে আইপ্যাডেUIPopoverController

এটি আইফোন এবং আইপ্যাড উভয়ই ব্যবহার করার জন্য একটি কোড এখানে রয়েছে:

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

সুইফ্ট 4.2 / সুইফ্ট 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
"নতুন" সুইফট সিনট্যাক্সের জন্য, ইউআইপিপওভারআরও নির্দেশিকাউই যে কোনও ইউআইপিপোভারআরোডাইরেশন হওয়া উচিত nyএকটি এবং ইউআইইউসারইন্টারফেস আইডিওমফোন হ'ল ইউআইইউসারআইন্টারফেসআইডিয়ম.ফোন
ইপেজ_এড

1
অনেক ধন্যবাদ, এটি, ইপেজ_এডের মন্তব্যের সাথে মিলিত হয়ে, এক্সকোড 7 এবং সুইফট 2 এ কাজ করে I've
অলিভার জাং

1
UIPopoverController সঙ্গে আইওএস 9. অবচিত
cbartel

3
UIPopOverController আইওএস 9. মধ্যে অবচিত
লীনা

1
প্রত্যেকের এই উত্তর দেওয়া উচিত কারণ দ্রুতগতির চেয়ে আইওএস উত্তরগুলির জন্য চলাচল করা সহজ .. আপনি আমার দিনটি তৈরি করেছেন ধন্যবাদ আপনাকে ধন্যবাদ।
এমবিএইচ

42

আমি সম্প্রতি এই মূল সমস্যাটির মুখোমুখি হয়েছি (মূল প্রশ্ন) সুইফট ২.০ এ, যেখানে UIActivityViewController আইফোনগুলির জন্য দুর্দান্ত কাজ করেছে, তবে আইপ্যাডস সিমুলেট করার সময় ক্র্যাশ হয়েছিল।

আমি এখানে উত্তরগুলির এই থ্রেডে যুক্ত করতে চাই যে, কমপক্ষে সুইফট ২.০ এ আপনার কোনও বিবৃতি দরকার নেই। আপনি ঠিক করতে পারেনpopoverPresentationController alচ্ছিক ।

দ্রুত সরানো হিসাবে, গৃহীত উত্তরটি বলে আসছে যে আপনার কেবল একটি সোর্স ভিউ, কেবল একটি উত্সরেক্ট বা একটি বারবটন আইটেম থাকতে পারে তবে ইউআইপিপভারপ্রেমেশন কনট্রোলারের জন্য অ্যাপলের ডকুমেন্টেশন অনুসারে আপনার নিম্নলিখিতগুলির একটি প্রয়োজন:

  • barButtonItem
  • সোর্সভিউ এবং উত্সরেক্ট

আমি যে বিশেষ উদাহরণটিতে কাজ করছিলাম তা নীচে রয়েছে, যেখানে আমি একটি ফাংশন তৈরি করছি যা একটি UIView(সোর্সভিউ এবং উত্সরেক্টের জন্য) এবং String(ইউআইএসিটিভিউভিউ কনট্রোলারের একমাত্র ক্রিয়াকলাপ আইটেম) গ্রহণ করে।

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)
}

এই কোডটি আইফোন এবং আইপ্যাডে (এমনকি আমার মনে হয় টিভিওএস) কাজ করে - যদি ডিভাইস সমর্থন না করে popoverPresentationController তবে দুটি লাইনের কোড যা উল্লেখ করেছে তা অবশ্যই অগ্রাহ্য করা হবে।

কিন্ডা চমৎকার যে আইপ্যাডগুলির জন্য এটির কাজ করার জন্য আপনার যা করা দরকার তা হ'ল কেবল দুটি লাইনের কোড যুক্ত করুন, বা আপনি যদি বারবার বাটন আইটেম ব্যবহার করছেন তবে একটি!


2
এই দ্রবণটি অন্যান্য যে সমাধানগুলি ব্যবহার করতে হয় তার থেকে অনেক বেশি পরিষ্কার মনে হয় respondsToSelectorবা UIUserInterfaceIdiomএটি আরও ভাল ভাষা হিসাবে সুইফটের সাথে ফিট করে। respondsToSelectorআইওএস 7-র জন্য এটি প্রয়োজনীয় বলে মনে হলেও , আইওএসের নতুন সংস্করণগুলি ব্যবহার করা হলে এটি অবশ্যই যাওয়ার উপায় বলে মনে হচ্ছে।
মার্কাস

18

আমি প্রচুর লোককে সুইফট কোড ব্যবহার করার সময় আইফোন / আইপ্যাড ইত্যাদি হার্ডকোডিং করতে দেখি।

এটি প্রয়োজন হয় না, আপনাকে ভাষার বৈশিষ্ট্যগুলি ব্যবহার করতে হবে। নিম্নলিখিত কোডটি ধরে নিয়েছে আপনি একটি ইউআইবারবারটন আইটেম ব্যবহার করবেন এবং আইফোন এবং আইপ্যাড উভয় ক্ষেত্রেই কাজ করবেন ।

@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)
 }

কীভাবে কোনও বিবৃতি বা অন্য কোনও ক্রেজি জিনিস নেই তা লক্ষ্য করুন। Alচ্ছিক আনারপ্যাটিং আইফোনে শূন্য হবে, সুতরাং লাইনটি vc.popoverPresentationController?আইফোনগুলিতে কিছুই করবে না।


কিভাবে এই টিউটোরিয়াল প্রসঙ্গে তাকান: হ্যাকিংউইথসইউইফট্ রিড //২ ২
ডেভ ক্লিমন

1
টিউটোরিয়ালে পপওভারপ্রেসেশন কনট্রোলারের উল্লেখ নেই, যাতে কোডটি আইপ্যাড আইওএস 9.x এ ক্র্যাশ হয়ে যায়। সমাধানটি vc.popoverPresentationController?.barButtonItem = navigationItem.rightBarButtonItemভিউ কন্ট্রোলার উপস্থাপনের আগে যুক্ত করা হবে ।
মার্টিন মার্কনকিনি

হাই মার্টিন ... আমার কাছে ইতিমধ্যে একটি লাইনের মতো চেহারা ছিল, এতে shareTapped(): vc.popoverPresentationController?.barButtonItem = sender as? UIBarButtonItemউভয়ই ক্র্যাশ হয়েছে। আমি কি ভুল করছি? আমি এখানে থাকাকালীন আমি কীভাবে পপওভারকে বিভিন্ন শেয়ার পরিষেবাদি যেমন ফেসবুক, টুইটার ইত্যাদির মাধ্যমে পপওভার করব?
ডেভ ক্লেমন

আর ক্রাশটি কী? আপনি নিজের প্রশ্ন পোস্ট করতে চাইতে পারেন। senderসত্য যে এটি একটি UIBarButtonItem। ভিসি নেই তা পরীক্ষা করুন nil। আপনি একটি ভিউকন্ট্রোলার উপস্থাপন করতে পারেন তা পরীক্ষা করুন ... ক্র্যাশ / কোডটি না দেখে বলা শক্ত। যদি ব্যবহারকারী অ্যাপটি ইনস্টল করে থাকে তবে পরিষেবাগুলি স্বয়ংক্রিয়ভাবে পপুলেটে যাবে (যদি না আপনি স্পষ্টভাবে কিছু বাদ দেওয়ার সিদ্ধান্ত নেন)।
মার্টিন মার্কনকিনি

1
@ ডেভক্লিম্যান হ্যাঁ, আইবিআউটলেট এবং আইবিএ ক্রিয়াকলাপগুলি মুছে ফেলা / পুনঃনামকরণ করা হলে Xcode খুব খারাপ লাগে এবং এটি শুরু হওয়ার পরে ক্র্যাশ হয়ে যায়। আইওএসে এটি করার আলাদা কোনও উপায় নেই, আপনার এক্সকোড এবং ইন্টারফেসবিল্ডার ব্যবহার করা দরকার। আপনি "কোডে" প্রচুর কাজ করতে পারেন তবে কিছুটির জন্য "ড্রাগন এবং ড্রপিং" দরকার। অ্যাপল আপনাকে যতটা সম্ভব স্টোরিবোর্ড এবং ইন্টারফেসবিল্ডার ব্যবহার করতে চায় ... তাই এটিতে
অভ্যস্ত

10

Xamarin.iOS ব্যবহার করে সমাধান।

আমার উদাহরণে আমি একটি স্ক্রিন ক্যাপচার করছি, একটি চিত্র উত্পাদন করছি এবং ব্যবহারকারীকে চিত্রটি ভাগ করে নেওয়ার সুযোগ দিচ্ছি। আইপ্যাডের পপ আপটি প্রায় পর্দার মাঝখানে স্থাপন করা হয়।

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

আপনাকে অনেক ধন্যবাদ :) একটি নির্ভরশীলতা পরিষেবা ব্যবহার করে জামারিন ফর্মগুলির সাথে কাজ করে
রিকার্ডো রোমো

7

সুইফ্ট, আইওএস 9/10 (ইউআইপিপভারকন্ট্রোলার অবনমিত হওয়ার পরে)

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
সুইফ্ট 3 এটিকে সমর্থন করে না
মাকসিম নিয়াজেভ

5

আইপ্যাডের জন্য এটি ঠিক করার জন্য সুইফটে, আমি খুঁজে পেয়েছি এটি করার মতো সর্বোত্তম উপায়।

    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
    }

@ গ্যালেন উত্তরটি ব্যবহার করুন। আইওএস 8 +
ডুজমেন

4

সুইফট ২.০ এর জন্য ঠিক করুন

    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
ইউআইপিপওভারকন্ট্রোলার অবচিত করা হয়েছে।
লেভিনসনটেকনোলজিস

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)
}

4

আপনি যদি দেখান UIActivityViewControllerUIBarButtonItem নীচের কোডটি ব্যবহারের জন্য ক্লিক করেন :

activityViewController.popoverPresentationController?.barButtonItem = sender

অন্যথায়, আপনি যদি অন্য নিয়ন্ত্রণ ব্যবহার করেন, উদাহরণস্বরূপ এ UIButton ব্যবহার করেন, , নিম্নলিখিত কোডটি ব্যবহার করুন:

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

ডকুমেন্টেশন থেকে UIPopoverPresentationController :

var barButtonItem: UIBarButtonItem? { get set }

নির্দিষ্ট বার বোতাম আইটেমটিতে পপওভার অ্যাঙ্কর করতে এই সম্পত্তিটির একটি মান নির্ধারণ করুন। উপস্থাপন করা হলে পপওভারের তীরটি নির্দিষ্ট আইটেমটির দিকে নির্দেশ করে। বিকল্পভাবে, আপনি পপওভারের জন্য সোর্স ভিউ এবং উত্সরেক্ট বৈশিষ্ট্য ব্যবহার করে অ্যাঙ্কর অবস্থান নির্দিষ্ট করতে পারেন।


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

উদ্দেশ্য-সি এর জন্য সমাধান এবং ইউআইপিপওভারপ্রেজেশন কনট্রোলার ব্যবহার সহ

    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

আমি পরবর্তী কোড চেষ্টা করেছিলাম এবং এটি কাজ করে:

প্রথমে আপনার ভিউ কন্ট্রোলারে একটি বার বোতাম আইটেম রাখুন তারপরে একটি আইবিআউটলেট তৈরি করুন:

@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

আমি এই সমাধানটি পেয়েছি প্রথমত, আপনার ভিউ কন্ট্রোলার যা পপওভার উপস্থাপন করছে তাদের <UIPopoverPresentationControllerDelegate>প্রোটোকলটি প্রয়োগ করা উচিত ।

এরপরে, আপনার popoverPresentationControllerপ্রতিনিধি সেট করতে হবে need

এই ফাংশন যুক্ত করুন:

- (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

আইফোন এবং আইপ্যাডে কাজ করে সুইফট 4 নিম্নলিখিত কোডে। ডকুমেন্টেশন অনুযায়ী

প্রদত্ত ডিভাইস আইডিয়ামটির জন্য উপযুক্ত উপায় ব্যবহার করে দর্শন নিয়ামককে উপস্থাপন এবং বরখাস্ত করা আপনার দায়িত্ব। আইপ্যাডে, আপনাকে অবশ্যই একটি পপওভারে ভিউ কন্ট্রোলার উপস্থাপন করতে হবে। অন্যান্য ডিভাইসে, আপনাকে অবশ্যই এটি মডেল উপস্থাপন করতে হবে।

 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

আমি সুইফট ৫ ব্যবহার করছি, আমি যখন আইপ্যাডে আমার অ্যাপ্লিকেশনটিতে "শেয়ার বোতাম" ক্লিক করি তখন ক্র্যাশ হওয়ার একই সমস্যা ছিল। এই সমাধান খুঁজে পেয়েছি। পদক্ষেপ 1: "দর্শন" অবজেক্টটি (অবজেক্ট লাইব্রেরিতে "ইউআইভিউ" অনুসন্ধান করুন) মেইন স্টোরবোর্ডে যুক্ত করুন। পদক্ষেপ 2: ভিউকন্ট্রোলআরউইফটটিতে একটি @ আইবিআউটলেট তৈরি করুন এবং কোনও নাম নির্ধারণ করুন (যেমন: ভিউ 1)

পদক্ষেপ 3: উপরোক্ত নামটি (যেমন: ভিউ 1) সোর্স ভিউ হিসাবে যুক্ত করুন। এটি আমার "শেয়ার বোতাম" ক্রিয়া।

@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

সুইফট ২.০ এর জন্য। আমি দেখতে পেয়েছি যে আপনি যদি আইপ্যাডের একটি শেয়ার বোতামে পপওভার অ্যাঙ্কর করার চেষ্টা করছেন তবে এটি কাজ করে। এটি ধরে নেওয়া হয় যে আপনি নিজের সরঞ্জামদণ্ডে শেয়ার বোতামের জন্য একটি আউটলেট তৈরি করেছেন।

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

আপনি যদি সুইফ্ট ব্যবহার করে আইপ্যাডের জন্য বিকাশ করছেন তবে সাবধান হন, এটি ডিবাগের ক্ষেত্রে ঠিকঠাক কাজ করবে, তবে প্রকাশের সময় ক্রাশ হবে। এটি টেস্টফ্লাইট এবং অ্যাপস্টোরের সাথে কাজ করার -noneজন্য, মুক্তির জন্য ব্যবহার করে সুইফ্টের জন্য অপ্টিমাইজেশন অক্ষম করুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.