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


194

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

জিনিষের পাল্টাপাল্টি: ভুল জায়গায় রাখা চিত্র

সঠিক: এখানে চিত্র বর্ণনা লিখুন

ইন্টারফেসে এটি দেখানোর জন্য আমি নীচের কোডটি ব্যবহার করি:

    let alert = UIAlertController()
    // setting buttons
    self.presentModalViewController(alert, animated: true)

আইপ্যাডের জন্য এটি যুক্ত করার অন্য কোনও উপায় আছে? নাকি অ্যাপল স্রেফ আইপ্যাড ভুলে গেছে, না বাস্তবায়িত হয়েছে, এখনও?

উত্তর:


284

আপনি UIAlertControllerব্যবহার করে একটি পপওভার থেকে একটি উপস্থাপন করতে পারেন UIPopoverPresentationController

ওবজে-সি তে:

UIViewController *self; // code assumes you're in a view controller
UIButton *button; // the button you want to show the popup sheet from

UIAlertController *alertController;
UIAlertAction *destroyAction;
UIAlertAction *otherAction;

alertController = [UIAlertController alertControllerWithTitle:nil
                                                      message:nil
                           preferredStyle:UIAlertControllerStyleActionSheet];
destroyAction = [UIAlertAction actionWithTitle:@"Remove All Data"
                                         style:UIAlertActionStyleDestructive
                                       handler:^(UIAlertAction *action) {
                                           // do destructive stuff here
                                       }];
otherAction = [UIAlertAction actionWithTitle:@"Blah"
                                       style:UIAlertActionStyleDefault
                                     handler:^(UIAlertAction *action) {
                                         // do something here
                                     }];
// note: you can control the order buttons are shown, unlike UIActionSheet
[alertController addAction:destroyAction];
[alertController addAction:otherAction];
[alertController setModalPresentationStyle:UIModalPresentationPopover];

UIPopoverPresentationController *popPresenter = [alertController 
                                              popoverPresentationController];
popPresenter.sourceView = button;
popPresenter.sourceRect = button.bounds;
[self presentViewController:alertController animated:YES completion:nil];

সুইফট ৪.২-এর সম্পাদনা, যদিও এর জন্য অনেকগুলি ব্লগ পাওয়া যায় তবে এটি যেতে এবং সেগুলি অনুসন্ধান করতে আপনার সময় সাশ্রয় করতে পারে।

 if let popoverController = yourAlert.popoverPresentationController {
                popoverController.sourceView = self.view //to set the source of your alert
                popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0) // you can set this as per your requirement.
                popoverController.permittedArrowDirections = [] //to hide the arrow of any particular direction
            }

[সতর্কতা নিয়ন্ত্রণকারী.ভিউ সেটটিন্টকালার: [ইউআইকলার ব্ল্যাক কালার]] ব্যবহার করুন; আপনি যদি পাঠ্যটি না দেখেন। ইউআইএলআর্টকন্ট্রোলার ডিফল্টরূপে উইন্ডোর রঙিন রঙ ব্যবহার করে, যা এই উদাহরণে সাদা এবং অদৃশ্য হতে পারে।
কেন

2
বাতিল বোতামটি আইপ্যাডে প্রদর্শিত হচ্ছে না
ভাভিন রামানি

14
@ ভাবিনামণি বাতিল বোতামগুলি পপওভার থেকে স্বয়ংক্রিয়ভাবে সরানো হবে, কারণ পপওভারের বাইরে ট্যাপ করা একটি পপওভার প্রসঙ্গে "বাতিল" উপস্থাপন করে।
ক্রিস্টোফেরড্রাম

এই দুর্দান্ত, আমার সমস্যা সমাধান! তোমাকে অনেক ধন্যবাদ!
মাহির তায়ির

109

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

  • barButtonItem
  • sourceView
  • sourceRect

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

alertController.popoverPresentationController.barButtonItem = button;

কোডের উদাহরণ:

UIAlertAction *actionDelete = nil;
UIAlertAction *actionCancel = nil;

// create action sheet
UIAlertController *alertController = [UIAlertController
                                      alertControllerWithTitle:actionTitle message:nil
                                      preferredStyle:UIAlertControllerStyleActionSheet];

// Delete Button
actionDelete = [UIAlertAction
                actionWithTitle:NSLocalizedString(@"IDS_LABEL_DELETE", nil)
                style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {

                    // Delete
                    // [self deleteFileAtCurrentIndexPath];
                }];

// Cancel Button
actionCancel = [UIAlertAction
                actionWithTitle:NSLocalizedString(@"IDS_LABEL_CANCEL", nil)
                style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
                    // cancel
                    // Cancel code
                }];

// Add Cancel action
[alertController addAction:actionCancel];
[alertController addAction:actionDelete];

// show action sheet
alertController.popoverPresentationController.barButtonItem = button;
alertController.popoverPresentationController.sourceView = self.view;

[self presentViewController:alertController animated:YES
                 completion:nil];

28
এটি অ্যাঙ্কর পয়েন্ট বৈশিষ্ট্য "তিনটির মধ্যে একটি নয়"; এটি হ'ল: "হয় সোর্সভিউ এবং সোর্সরেট বা একটি বারবটন আইটেম"।
রোলেরিক

2
রোলেরিকের জন্য +1। অ্যাপলের ডকুমেন্টেশন সোর্স রেক্ট সম্পর্কিত বলে: "পপওভারের জন্য অ্যাঙ্কর অবস্থান নির্দিষ্ট করতে সোর্সভিউয়ের সম্পত্তিটির সাথে একত্রে এই সম্পত্তিটি ব্যবহার করুন Al - বিকাশকারী.অ্যাপল.
বেন প্যাচ

ওহ মানুষ. এটি কোনও লগ বার্তা ছাড়াই ক্র্যাশ হয়েছে। কমপক্ষে কমপাইল-টাইম সতর্কতা কেন দেবে না (সর্বজনীন অ্যাপ্লিকেশনগুলির জন্য)?
মাইক কেসকিনভ

85

সুইফট 2 এ, আপনি আইফোন এবং আইপ্যাডে এটি সঠিকভাবে প্রদর্শন করতে এরকম কিছু করতে চান:

func confirmAndDelete(sender: AnyObject) {
    guard let button = sender as? UIView else {
        return
    }

    let alert = UIAlertController(title: NSLocalizedString("Delete Contact?", comment: ""), message: NSLocalizedString("This action will delete all downloaded audio files.", comment: ""), preferredStyle: .ActionSheet)
    alert.modalPresentationStyle = .Popover

    let action = UIAlertAction(title: NSLocalizedString("Delete", comment: ""), style: .Destructive) { action in
        EarPlaySDK.deleteAllResources()
    }
    let cancel = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .Cancel) { action in

    }
    alert.addAction(cancel)
    alert.addAction(action)

    if let presenter = alert.popoverPresentationController {
        presenter.sourceView = button
        presenter.sourceRect = button.bounds
    }
    presentViewController(alert, animated: true, completion: nil)
}

আপনি যদি উপস্থাপক সেট না করেন, আপনি -[UIPopoverPresentationController presentationTransitionWillBegin]নীচের বার্তার সাথে আইপ্যাডে ব্যতিক্রম শেষ করবেন :

মারাত্মক ব্যতিক্রম: এনএসজেনেরিক এক্সসেপশন আপনার অ্যাপ্লিকেশনটিতে স্টাইলের একটি ইউআইএলআরল্টকন্ট্রোলার (<ইউআইএলার্টকন্ট্রোলার: 0x17858a00>) উপস্থাপন করা হয়েছে IA এই শৈলীর সাথে একটি ইউআইএলআরলেটকন্ট্রোলারের মডেলপ্রেজেন্টেশন স্টাইল হ'ল ইউআইএমডালপ্রেসিভেশনপোভার। সতর্কতা নিয়ন্ত্রকের পপওভারপ্রেসেশন কন্ট্রোলারের মাধ্যমে আপনাকে অবশ্যই এই পপওভারের জন্য অবস্থানের তথ্য সরবরাহ করতে হবে। আপনাকে অবশ্যই একটি সোর্স ভিউ এবং সোর্সরেট বা একটি বারবটন আইটেম সরবরাহ করতে হবে। আপনি যখন সতর্কতা নিয়ন্ত্রক উপস্থাপন করবেন এই তথ্যটি যদি জানা না থাকে তবে আপনি এটি ইউআইপিপভারপ্রেসিয়েশন কনট্রোলারডেলিগেট পদ্ধতি -প্রেমপোয়ারপোপারপ্রেসেশনে সরবরাহ করতে পারেন।


26

সুইফট 3.0 এবং উচ্চতর জন্য আপডেট

    let actionSheetController: UIAlertController = UIAlertController(title: "SomeTitle", message: nil, preferredStyle: .actionSheet)

    let editAction: UIAlertAction = UIAlertAction(title: "Edit Details", style: .default) { action -> Void in

        print("Edit Details")
    }

    let deleteAction: UIAlertAction = UIAlertAction(title: "Delete Item", style: .default) { action -> Void in

        print("Delete Item")
    }

    let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .cancel) { action -> Void in }

    actionSheetController.addAction(editAction)
    actionSheetController.addAction(deleteAction)
    actionSheetController.addAction(cancelAction)

//        present(actionSheetController, animated: true, completion: nil)   // doesn't work for iPad

    actionSheetController.popoverPresentationController?.sourceView = yourSourceViewName // works for both iPhone & iPad

    present(actionSheetController, animated: true) {
        print("option menu presented")
    }

আমি ড্রয়ারটি ব্যবহার করছি, আমি প্রদত্ত সমাধানটি ব্যবহার করার চেষ্টা করি তবে ব্যর্থ হয়েছি।
রানা আলী ওয়াসিম

আমার কোড নেই, কারণ আমি অ্যাকশনশিটটি সরিয়ে সতর্কতা ব্যবহার করি use তবে আমার কোডে কেবলমাত্র একটি লাইন আলাদা ছিল যাক অ্যাকশনশিট = ইউআইএলার্টকন্ট্রোলার (শিরোনাম: "", বার্তা: "", পছন্দসই স্টাইল: .অ্যাকশনশিট) তবে আমি লগগুলি মনে করি, এটি ড্রয়ারের কারণে ক্র্যাশ হয়েছিল, আমি মনে করি যে ড্রয়ারটি খোলার জন্য প্রতিরোধ করেছে অ্যাকশন শীট কারণ এটি স্ক্রিনের বাম কোণে খোলার ছিল। ইস্যুটি কেবল আইপ্যাডে ছিল।
রানা আলী ওয়াসিম

15

2018 আপডেট

আমি কেবলমাত্র এই কারণে একটি অ্যাপ্লিকেশন প্রত্যাখ্যান করেছি এবং খুব দ্রুত রেজোলিউশনটি হ'ল একটি অ্যাকশন শীটটি ব্যবহার করে সতর্কতাতে পরিবর্তন করা।

একটি মোহন কাজ করেছে এবং অ্যাপ স্টোর পরীক্ষকগণ ঠিক ঠিক উত্তীর্ণ হয়েছে।

সবার জন্য উপযুক্ত উত্তর নাও হতে পারে তবে আমি আশা করি এটি আপনার কিছুটিকে একটি আচার থেকে দ্রুত বের করে আনতে সহায়তা করে।


1
আইপ্যাড এবং আইফোন উভয় ক্ষেত্রেই পুরোপুরি কাজ করেছেন - ধন্যবাদ
জেরেমি অ্যান্ড্রুজ

এটি সেরা সমাধান নয়। কখনও কখনও আপনি অ্যাকশনশিট স্টাইলটি ব্যবহার করতে চান যা আধুনিক।
শেডটিড

9

উপরের দিকে সুইফট 4

আমি একটি এক্সটেনশন তৈরি করেছি

extension UIViewController {
  public func addActionSheetForiPad(actionSheet: UIAlertController) {
    if let popoverPresentationController = actionSheet.popoverPresentationController {
      popoverPresentationController.sourceView = self.view
      popoverPresentationController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
      popoverPresentationController.permittedArrowDirections = []
    }
  }
}

ব্যবহারবিধি:

let actionSheetVC = UIAlertController(title: "Title", message: nil, preferredStyle: .actionSheet)
addActionSheetForIpad(actionSheet: actionSheetVC)
present(actionSheetVC, animated: true, completion: nil)

আমি এটি চেষ্টা করেছিলাম তবে এক্সকোড 11.2.1 এ ফানক অ্যাড্যাকশনশিরফরিপ্যাড কল করতে সক্ষম নই
রানা আলী ওয়াসিম

@ রানাআলিওয়াসিম আপনি কি ইউআইভিউউকন্ট্রোলার ক্লাসের ভিতরে ফোন করছেন?
শেডটিড

হ্যাঁ. আমি এটি ইউআইভিউকন্ট্রোলার ক্লাসে কল করি। তবে এটি ইউআইভিউউকন্ট্রোলারের উত্তরাধিকার সূত্রে একটি বেস ক্লাস এবং বেস ক্লাসের সাথে উত্তরাধিকার সূত্রে প্রাপ্ত।
রানা আলী ওয়াসিম

8

এখানে একটি দ্রুত সমাধান:

NSString *text = self.contentTextView.text;
NSArray *items = @[text];

UIActivityViewController *activity = [[UIActivityViewController alloc]
                                      initWithActivityItems:items
                                      applicationActivities:nil];

activity.excludedActivityTypes = @[UIActivityTypePostToWeibo];

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
    //activity.popoverPresentationController.sourceView = shareButtonBarItem;

    activity.popoverPresentationController.barButtonItem = shareButtonBarItem;

    [self presentViewController:activity animated:YES completion:nil];

}
[self presentViewController:activity animated:YES completion:nil];

3
এই প্রশ্নটি ইউআইএএলআরটি কনট্রোলার সম্পর্কে, ইউআইএসিটিভিটিভিউ কনট্রোলার নয়
রোমান

আপনি কি ইউআইএসিটিভিটিভিউ কনট্রোলারের পাশাপাশি সুইফট 3-এর উত্তর আপডেট করতে পারবেন?
দিয়া

7

সুইফট 5

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

var alertStyle = UIAlertController.Style.actionSheet
if (UIDevice.current.userInterfaceIdiom == .pad) {
  alertStyle = UIAlertController.Style.alert
}

let alertController = UIAlertController(title: "Your title", message: nil, preferredStyle: alertStyle)

সম্পাদনা: প্রতি শেয়ারডোডের পরামর্শ অনুসারে "UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad" চেক অবচয়


2
আইওএস 13-তে 'UI_USER_INTERFACE_IDIOM ()' আইওএস 13.0 এ অবচয় করা হয়েছিল: ব্যবহার করুন - [ইউআইডিভাইস ব্যবহারকারীআইন্টারফেসআইডিয়াম] সরাসরি। আপনার এটি ইউআইডিওয়াইস.কন্ট্রেন.ইউসারআইন্টারফেস আইডিয়ম == .প্যাড
শেড টুড

2

আমার জন্য আমার কেবল নিম্নলিখিতগুলি যুক্ত করা দরকার:

if let popoverController = alertController.popoverPresentationController {
    popoverController.barButtonItem = navigationItem.rightBarButtonItem
}

2
যদি বিবৃতি বাদ এবং ঐচ্ছিক chaining ব্যবহার করতে পারেন: alertController.popoverPresentationController .barButtonItem = navigationItem.rightBarButtonItem?
ডেল

2

আপনার অ্যাকশনশিট উপস্থাপনের আগে কেবল নিম্নলিখিত কোডটি যুক্ত করুন:

if let popoverController = optionMenu.popoverPresentationController {
    popoverController.sourceView = self.view
    popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
    popoverController.permittedArrowDirections = []
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.