যার ভিউ উইন্ডো শ্রেণিবদ্ধ নয় এমন ইউআইভিউউকন্ট্রোলারে ইউআইভিউউকন্ট্রোলার উপস্থাপনের চেষ্টা


599

সবেমাত্র Xcode 4.5 ব্যবহার শুরু করেছিলাম এবং কনসোলে এই ত্রুটিটি পেয়েছি:

সতর্কতা: <ভিউকন্ট্রোলার: 0x1ec3e000> <ভিউকন্ট্রোলার: 0x1e3e000> এ <ফিনিশভিউ কনট্রোলার: 0x1e56e0a0> উপস্থাপনের চেষ্টা করুন!

দৃশ্যটি এখনও উপস্থাপন করা হচ্ছে এবং অ্যাপ্লিকেশনটিতে সমস্ত কিছুই ঠিকঠাকভাবে কাজ করছে। আইওএস 6 এ কি নতুন কিছু আছে?

দর্শনের মধ্যে পরিবর্তন করতে আমি এই কোডটি ব্যবহার করছি:

UIStoryboard *storyboard = self.storyboard;
finishViewController *finished = 
[storyboard instantiateViewControllerWithIdentifier:@"finishViewController"];

[self presentViewController:finished animated:NO completion:NULL];

3
presentViewController:animated:completionনেভ নিয়ন্ত্রণকারীকে কল করার চেষ্টা করা বাদ দিয়ে আমার ঠিক একই সমস্যা হচ্ছে । আপনি কি অ্যাপের প্রতিনিধিটিতে এটি করছেন?
টার্নফিল্ড

না আমি এটি এক ভিউ কন্ট্রোলার থেকে অন্য ভিউতে করছি। আপনি কি কোনও সমাধান খুঁজে পেয়েছেন?
কাইল গোসলান

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

আমারও একই সমস্যা, সমাধান হয়নি। অ্যাপের প্রতিনিধি থেকে এটি করা, এবং ইউটিআইটিবারকন্ট্রোলারকে মৌমাছনকারী "উপস্থিত ভিউকন্ট্রোলার" ডাকার রুটভিউ কনট্রোলার।
darksider

3
এছাড়াও, যদি মেককেএন্ডভিজেবল কল করার আগে এই পদ্ধতিটি কল করা হয়, তবে এটি পরে সরান
মাইক_হানে

উত্তর:


1296

আপনি কোথা থেকে এই পদ্ধতি কল করছেন? আমি viewDidLoadপদ্ধতির মধ্যে একটি মডেল ভিউ কন্ট্রোলার উপস্থাপন করার চেষ্টা করছিলাম এমন একটি সমস্যা আমার ছিল । আমার জন্য সমাধানটি ছিল এই কলটি viewDidAppear:পদ্ধতিতে সরিয়ে নেওয়া।

আমার অনুমান যে দৃশ্য নিয়ামক দৃষ্টিভঙ্গি হল নয় বিন্দুর সাহায্যে লোড করা হয়েছে (যখন এ উইন্ডোর দৃশ্য শ্রেণীবিন্যাসে viewDidLoadবার্তা পাঠিয়েছে হয়), কিন্তু এটা হয় উইন্ডোতে শ্রেণীবিন্যাসে পরে এটি উপস্থাপন করা হয়েছে (যখন viewDidAppear:বার্তা পাঠিয়েছে হয়) ।


সতর্ক করা

আপনি যদি কোনও কল করে presentViewController:animated:completion:থাকেন তবে viewDidAppear:আপনি যখন এমন কোনও সমস্যার মধ্যে চলে যেতে পারেন যার মাধ্যমে মডেল ভিউ কন্ট্রোলার সর্বদা উপস্থাপিত হয় যখনই ভিউ কন্ট্রোলারের দৃষ্টিভঙ্গি উপস্থিত হয় (যা বোঝায়!) এবং সুতরাং উপস্থাপিত মোডাল ভিউ কন্ট্রোলার কখনই চলে যাবে না .. ।

সম্ভবত মডেল ভিউ কন্ট্রোলার উপস্থাপনের জন্য এটি সেরা জায়গা নয় বা সম্ভবত কিছু অতিরিক্ত স্থিতি রাখা দরকার যা উপস্থাপিত ভিউ কন্ট্রোলারকে এটি অবিলম্বে মডেল ভিউ নিয়ামককে উপস্থাপন করা উচিত কিনা তা সিদ্ধান্ত নিতে দেয় should


6
@ জেমস আপনি যে সঠিক, ভিউ উইল অ্যাপয়ার সমাধান না হয়ে এবং একবার ভিডডআইপিয়ার ডাকা হওয়ার পরে দৃশ্যটি দৃশ্যত শ্রেণিবদ্ধে নেই । এটি যদি আমার প্রশ্ন হয় তবে আমি এই উত্তরটি গ্রহণ করব;)
ম্যাট ম্যাক

6
@ জেমস ধন্যবাদ। ভিউডিডঅ্যাপার ব্যবহার করে আমার জন্যও সমস্যার সমাধান হয়েছে। বোধ হয়।
আলী

44
আমি আশা করি আমি এই দুটি বার upvote করতে পারে। আমার সবেমাত্র এই সমস্যা হয়েছিল এবং আমি থ্রেডে এসে গিয়েছিলাম এটি খুঁজে পেতে আমি শেষ বারটি দেখেছি আমি ইতিমধ্যে উত্সাহিত করেছি।
শ্রোকওয়েল

7
নোট করুন যে আপনি যখন ভিউডিড অ্যাপে ভিসি পরিবর্তন করেন, এটি অ্যানিমেশন সহ কোনও বিভাগের সম্পাদনের কারণ হয়ে থাকে। পটভূমির ফ্ল্যাশ / প্রদর্শনের কারণ ঘটায়।
ভিনসেন্ট

2
হ্যাঁ কৌশলটি ভিউউইল অ্যাপয়ার: (BOOL) এটি সঠিক হিসাবে অ্যানিমেটেড। আপনাকে আরও একটি গুরুত্বপূর্ণ বিষয়টিকে পদ্ধতিতে সুপার হিসাবে কল করতে হবে, [সুপার ভিউডিডঅ্যাপার: অ্যানিমেটেড] হিসাবে; এটি ছাড়া এটি কাজ করে না
বুটমেকার

66

আর একটি সম্ভাব্য কারণ:

আমি দুর্ঘটনাক্রমে দু'বার একই ভিউ কন্ট্রোলার উপস্থাপন করার সময় আমার এই সমস্যাটি ছিল had (একবার performSegueWithIdentifer:sender:যা বোতাম টিপে যখন ডাকা হয়েছিল, এবং দ্বিতীয় বারের সাথে সিগু বোতামের সাথে সরাসরি সংযুক্ত হয়েছিল)।

কার্যকরভাবে, দুটি বিভাগ একই সাথে গুলি চালাচ্ছিল এবং আমি ত্রুটি পেয়েছি: Attempt to present X on Y whose view is not in the window hierarchy!


4
আমারও একই ত্রুটি ছিল এবং এখানে আপনার উত্তর আমাকে কী ঘটছে তা
অনুধাবন

1
আমি পুরানো সেগুটি মুছে ফেলেছি এবং ভিসিকে ভিসির সাথে সংযুক্ত করেছি। ভিসির সাথে স্টোরিবোর্ডে বোতামটি সংযুক্ত করার কোনও উপায় আছে কারণ সেভাবে আমার জন্য ত্রুটি থাকে?
এমসিবি

আমার একই ত্রুটি হয়েছিল, আপনার উত্তর আমার সমস্যার সমাধান করেছে, আপনার মনোযোগের জন্য ধন্যবাদ। আন্তরিক শুভেচ্ছা.
আইম্বুরাক

1
হ্যাঁ, দুর্ঘটনাক্রমে আমি দুটি ভিসিও তৈরি করছিলাম: বোতাম এবং পারফরমেন্স থেকে, টিপটির জন্য ধন্যবাদ !!!
বোরঝ

1
আমার ক্ষেত্রে আমি present(viewController, animated: true, completion: nil)একটি লুপের ভিতরে ডাকছিলাম।
সামো

38

viewWillLayoutSubviewsএবং viewDidLayoutSubviews(আইওএস 5.0+) এই উদ্দেশ্যে ব্যবহার করা যেতে পারে। এগুলি ভিউডিড অ্যাপের চেয়ে আগে বলা হয়।


3
তবুও এগুলি অন্যান্য অনুষ্ঠানেও ব্যবহৃত হয় তাই আমি মনে করি এগুলি সম্ভবত একটি দর্শনের "জীবনকাল" এ ডাকা হবে।
জনি

নামগুলি অনুসারে - পদ্ধতিগুলি কী তাও তা নয় not ভিউডিডঅ্যাপার সঠিক। লাইফাইসাইকেলের ভিউটি পড়া ভাল ধারণা।
ব্যবহারকারী

এটিই সেরা সমাধান। আমার ক্ষেত্রে, ভিডিডআইপিয়ারে উপস্থাপনের ফলে মডেলটি লোড হওয়ার আগে ভিউ কন্ট্রোলারের দ্বিতীয় বিভাজনের কারণ ঘটে যা অগ্রহণযোগ্য।
টিমিলিগান

সতর্কতা প্রদর্শনের চেষ্টা করার সময় এই উত্তরটি আমার পক্ষে সবচেয়ে ভাল কাজ করেছে। সতর্কতাটি প্রদর্শন করা হবে না যখন আমি এটিকে ভিডলিড এবং ভিউউইল অ্যাপ্লায় রাখি।
uplearnedu.com

26

প্রধান দৃশ্যে যে কোনও সাবভিউ প্রদর্শন করার জন্য, দয়া করে নিম্নলিখিত কোডটি ব্যবহার করুন

UIViewController *yourCurrentViewController = [UIApplication sharedApplication].keyWindow.rootViewController;

while (yourCurrentViewController.presentedViewController) 
{
   yourCurrentViewController = yourCurrentViewController.presentedViewController;
}

[yourCurrentViewController presentViewController:composeViewController animated:YES completion:nil];

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

UIViewController *yourCurrentViewController = [UIApplication sharedApplication].keyWindow.rootViewController;

while (yourCurrentViewController.presentedViewController) 
{
   yourCurrentViewController = yourCurrentViewController.presentedViewController;
}

[yourCurrentViewController dismissViewControllerAnimated:YES completion:nil];

আমার জন্যও কাজ করেছিলেন
আজিজ জাভেদ

17

আমারও এই সমস্যা যখন আমি একটি উপস্থিত করার চেষ্টা সম্মুখীন UIViewControllerমধ্যে viewDidLoad। জেমস বেডফোর্ডের উত্তরটি কার্যকর হয়েছিল, তবে আমার অ্যাপ্লিকেশনটি 1 বা 2 সেকেন্ডের জন্য প্রথম পটভূমিটি দেখায়।

কিছু গবেষণা করার পরে, আমি এটি ব্যবহার করে এটি সমাধান করার একটি উপায় খুঁজে পেয়েছি addChildViewController

- (void)viewDidLoad
{
    ...
    [self.view addSubview: navigationViewController.view];
    [self addChildViewController: navigationViewController];
    ...
}

9
আমার মনে হয় আপনি [navigationViewController didMoveToParentViewController: স্ব] অনুপস্থিত
foFox

2
আমি ফোফক্সের পরামর্শ সহ আপনার কোডটি চেষ্টা করেছি এবং আমি যখন এটির পিতা-মাতার কাছ থেকে সরিয়ে ফেলতে যাব তখন এটি যায় না। Lololol। তবুও কোনও স্থির করে আটকে নেই।
লজিকসৌরাস রেক্স

সুইফট 3.1 এ কাজ করে
কঙ্গ

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

14

সম্ভবত, আমার মতো, আপনারও একটি ভুল মূল রয়েছে viewController

আমি ViewControllerএকটি non-UIViewControllerপ্রসঙ্গে একটি প্রদর্শন করতে চাই ,

সুতরাং আমি এই জাতীয় কোড ব্যবহার করতে পারি না:

[self presentViewController:]

সুতরাং, আমি একটি ইউআইভিউকন্ট্রোলার পেয়েছি:

[[[[UIApplication sharedApplication] delegate] window] rootViewController]

কোনও কারণে (যৌক্তিক বাগ), এটি rootViewControllerপ্রত্যাশিত (একটি সাধারণ UIViewController) ব্যতীত অন্য কিছু । তারপরে আমি বাগটি সংশোধন করে rootViewControllerএকটি দিয়ে প্রতিস্থাপন করব UINavigationControllerএবং সমস্যাটি চলে গেছে।


8

টিএল; ডিআর আপনার কাছে কেবল 1 টি রুটভিউ কনট্রোলার থাকতে পারে এবং এটি সর্বাধিক উপস্থাপিত। সুতরাং যখন ভিউ কনট্রোলারটি অন্য ভিউকন্ট্রোলারটিকে উপস্থাপন করার চেষ্টা করবেন না যখন এটি ইতিমধ্যে বরখাস্ত করা হয়নি।

আমার নিজের কিছু পরীক্ষা করার পরে আমি একটি সিদ্ধান্তে পৌঁছেছি।

যদি আপনার কাছে এমন একটি রুটভিউ কনট্রোলার থাকে যা আপনি সবকিছু উপস্থাপন করতে চান তবে আপনি এই সমস্যায় পড়তে পারেন।

এখানে আমার রুট কনট্রোলার কোডটি (মূল থেকে ভিউকন্ট্রোলার উপস্থাপনের জন্য আমার শর্টকাটটি উন্মুক্ত) is

func open(controller:UIViewController)
{
    if (Context.ROOTWINDOW.rootViewController == nil)
    {
        Context.ROOTWINDOW.rootViewController = ROOT_VIEW_CONTROLLER
        Context.ROOTWINDOW.makeKeyAndVisible()
    }

    ROOT_VIEW_CONTROLLER.presentViewController(controller, animated: true, completion: {})
}

আমি যদি একটানা দু'বার ওপেন কল করি (সময় কেটে যায় নির্বিশেষে), এটি প্রথম উন্মুক্তটিতে ঠিক কাজ করবে, তবে দ্বিতীয় খোলায় নয়। দ্বিতীয় উন্মুক্ত প্রয়াসের ফলে উপরের ত্রুটি হবে।

তবে আমি যদি সর্বাধিক উপস্থাপিত ভিউটি বন্ধ করি তবে কলটি ওপেন করুন, আমি যখন আবার ওপেন কল করব তখন এটি ঠিক ঠিক কাজ করে (অন্য দর্শকের নিয়ন্ত্রণকারী)।

func close(controller:UIViewController)
{
    ROOT_VIEW_CONTROLLER.dismissViewControllerAnimated(true, completion: nil)
}

আমি যে সিদ্ধান্তে পৌঁছেছি তা হ'ল কেবলমাত্র অতি-সাম্প্রতিক-কলটির রুটভিউ কনট্রোলারটি হায়ারার্কি ভিউতে থাকে (আপনি এটিকে বাতিল করে দেন বা কোনও দৃশ্য সরিয়ে না নিলেও)। আমি সমস্ত লোডার কল (ভিডিডলিড, ভিউডিডঅ্যাপিয়ার এবং বিলম্বিত প্রেরণ কলগুলি) নিয়ে খেলার চেষ্টা করেছি এবং আমি পেয়েছি যে আমি এটির কাজ করতে পারার একমাত্র উপায় শীর্ষস্থানীয় দেখা নিয়ন্ত্রকের কেবলমাত্র উপস্থিত কলিং।


এটি অনেক বেশি সাধারণ সমস্যার মতো বলে মনে হচ্ছে যে অনেক উত্তর যে আপনাকে ভোট দিয়েছে। দুর্ভাগ্যক্রমে, এটি অত্যন্ত সহায়ক
রায়পস

হ্যাঁ সব ভাল এবং ভাল তবে সমাধানটি কী ... আমার একটি পটভূমি কর্মী থ্রেড রয়েছে যা একটি সার্ভারে গিয়ে স্টোরিবোর্ডগুলি বাম এবং ডানদিকে প্রদর্শন করে এবং পুরো পদ্ধতিটি বোগাস .. এটি অত্যন্ত খারাপ .. কী বাতাস হওয়া উচিত তা সম্পূর্ণরূপে একটি কৌতুক কারণ আমি ব্যাকগ্রাউন্ডের থ্রেডটিই করতে চাইছি: wait wait decide push screen to frontএবং এটি আইওএস কি অসম্পূর্ণ ????
মিঃ হিলিস

5

আমার সমস্যাটি ছিল আমি উইন্ডোটিতে ডাকার আগে আমি UIApplicationDelegateসে didFinishLaunchingWithOptionsপদ্ধতিতে সেগ করছিলাম makeKeyAndVisible()


কীভাবে? তুমি কি বিস্তারিত বলতে পারো? আমিও একই সমস্যার মুখোমুখি। যেমন UIViewController self.window .rootViewController = initialViewControlleripad self.window .makeKeyAndVisible ()?: UIViewController = mainStoryboardIpad.instantiateViewController ( "SplashController" withIdentifier:) এই আমার কোড দিন initialViewControlleripad হয়
shahtaj খালিদ

4

আমার পরিস্থিতিতে আমি আমার ক্লাসকে ওভাররাইডে রাখতে সক্ষম হইনি। সুতরাং, আমি যা পেয়েছি তা এখানে:

let viewController = self // I had viewController passed in as a function,
                          // but otherwise you can do this


// Present the view controller
let currentViewController = UIApplication.shared.keyWindow?.rootViewController
currentViewController?.dismiss(animated: true, completion: nil)

if viewController.presentedViewController == nil {
    currentViewController?.present(alert, animated: true, completion: nil)
} else {
    viewController.present(alert, animated: true, completion: nil)
}

3

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

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIImagePickerController *cameraView = [[UIImagePickerController alloc]init];
    [cameraView setSourceType:UIImagePickerControllerSourceTypeCamera];
    [cameraView setShowsCameraControls:NO];

    UIView *cameraOverlay = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 768, 1024)];
    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"someImage"]];
    [imageView setFrame:CGRectMake(0, 0, 768, 1024)];
    [cameraOverlay addSubview:imageView];

    [cameraView setCameraOverlayView:imageView];

    [self.navigationController presentViewController:cameraView animated:NO completion:nil];
//    [self presentViewController:cameraView animated:NO completion:nil]; //this will cause view is not in the window hierarchy error

}

3

আপনার যদি প্লে ভিডিওর সাথে অ্যাভিপ্লেয়ার অবজেক্ট থাকে তবে আপনাকে প্রথমে ভিডিওটি বিরতি দিতে হবে।


আমি বোঝাতে চাইছি ভিডিওটি প্রথমে থামানো / বিরতি দেওয়া উচিত।
ভ্লাদ

আসলে এটি আমাকে সাহায্য করেছিল, এটি আমাকে এই স্ট্যাকওভারফ্লো
ওমর এন শামালি

3

আমারও একই প্রশ্ন ছিল. সমস্যাটি হ'ল, পারফরম্যাসটিথআইডেন্টিফায়ার একটি বিজ্ঞপ্তি দিয়ে ট্রিগার করেছিল, আমি বিজ্ঞপ্তিটি মূল থ্রেডে রেখেই সতর্কতা বার্তাটি শেষ হয়ে গেল।


3

এটি চেষ্টা করে ভাল কাজ করছে। লিংক

UIViewController *top = [UIApplication sharedApplication].keyWindow.rootViewController;
[top presentViewController:secondView animated:YES completion: nil];

3

এটি যদি কাউকে সাহায্য করে তবে আমার সমস্যাটি অত্যন্ত নির্বোধ ছিল। পুরোপুরি অবশ্যই আমার দোষ। একটি বিজ্ঞপ্তি এমন একটি পদ্ধতি ট্রিগার করছিল যা মডেলকে কল করে। তবে আমি বিজ্ঞপ্তিটি সঠিকভাবে মুছে ফেলছি না, তাই এক পর্যায়ে আমার একাধিক বিজ্ঞপ্তি হবে, যাতে মডেলটি একাধিকবার কল হতে পারে। অবশ্যই, আপনি একবার মডেল কল করার পরে, ভিউকন্ট্রোলার যাকে বলে এটি ভিউ হায়ারার্কির মধ্যে আর বেশি নয়, সে কারণেই আমরা এই সমস্যাটি দেখি। আমার পরিস্থিতি অন্যান্য সমস্যাগুলির একটি গুচ্ছকেও সৃষ্টি করেছিল, যেমনটি আপনি আশা করবেন।

সুতরাং সংক্ষিপ্তসার হিসাবে, আপনি যা কিছু করছেন তা নিশ্চিত করুন যে মডেলগুলি একাধিকবার ডাকা হচ্ছে না


3

আপনি viewControllerকার্যত যে কোনও জায়গা থেকে কিছু প্রদর্শন করতে চান তা বিবেচনা করে আমি এমন একটি কোড দিয়ে শেষ করেছি যা শেষ পর্যন্ত আমার (সুইফট) কাজ করে । এই কোডটি স্পষ্টতই ক্র্যাশ হয়ে যাবে যখন কোনও রুটভিউকন্ট্রোলার উপলব্ধ নেই, এটাই প্রকাশ্য সমাপ্তি। এটি ব্যবহার করে সাধারণত ইউআই থ্রেডে প্রয়োজনীয় স্যুইচ অন্তর্ভুক্ত করে না

dispatch_sync(dispatch_get_main_queue(), {
    guard !NSBundle.mainBundle().bundlePath.hasSuffix(".appex") else {
       return; // skip operation when embedded to App Extension
    }

    if let delegate = UIApplication.sharedApplication().delegate {
        delegate.window!!.rootViewController?.presentViewController(viewController, animated: true, completion: { () -> Void in
            // optional completion code
        })
    }
}

বিটিডাব্লু বুঝতে কোথা থেকে আমি এই পদ্ধতিটি কল করি ... এটি অন্যথায় ইউআই-কম এসডিকে লাইব্রেরি, এটি নির্দিষ্ট (অপ্রকাশিত) ক্ষেত্রে আপনার অ্যাপের উপর নিজস্ব ইউআই প্রদর্শন করে।
আইগ্রাচেক

যদি কেউ আপনাকে এক্সটেনশানযুক্ত অ্যাপ্লিকেশনটিতে এসডিকে এম্বেড করার সিদ্ধান্ত নেয় তবে আপনি ক্রাশ এবং জ্বলুন। Sdk init পদ্ধতি [গুলি] আপনাকে অপব্যবহার করতে একটি ইউআইভিউ কনট্রোলার পাস করুন।
আন্তন ট্রপ্যাশকো

তুমি সত্যই আন্তোন। এই কোডটি তখন লেখা হয়েছিল যখন এক্সটেনশানগুলির অস্তিত্ব ছিল না এবং এসডিকে এখনও সেগুলির কোনওটিতে ব্যবহার করা হয়নি। আমি এই প্রান্ত-কেসটি এড়াতে একটি গার্ড ক্লজ যুক্ত করেছি।
igracitc

3

সাবধানবাণী এই ধরনের অর্থ করতে পারেন যে আপনি বর্তমান নতুন করার চেষ্টা করছেন View Controllerমাধ্যমে Navigation Controllerযখন এই Navigation Controllerবর্তমানে অন্য উপস্থাপন করছেন View Controller। এটি ঠিক করতে আপনাকে View Controllerপ্রথমে উপস্থাপিত এবং সমাপ্তিতে নতুনটিকে উপস্থাপন করতে হবে। সতর্কতার আরেকটি কারণ View Controllerথ্রেডে অন্যটি উপস্থাপনের চেষ্টা করা যেতে পারে main


2

আমি সম্পূর্ণরূপে ব্লকের start()ভিতরে ফাংশনটি সরিয়ে এটি স্থির করেছি dismiss:

self.tabBarController.dismiss(animated: false) {
  self.start()
}

self.present()স্টার্টে একটি ইউআইএনএভিগেশন কন্ট্রোলারের জন্য দুটিতে এবং অন্যটির জন্য একটিতে দুটি কল রয়েছে UIImagePickerController

এটা আমার জন্য এটি স্থির।


2

আমি সুইফট ৪.২ এ একই রকম সমস্যা পেয়েছি তবে আমার দৃষ্টিভঙ্গি দর্শন চক্র থেকে উপস্থাপিত হয়নি। আমি দেখতে পেলাম যে একই সময়ে আমার একাধিক সিগন উপস্থাপন করতে হবে। সুতরাং আমি dispatchAsyncAfter ব্যবহার করেছি।

func updateView() {

 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in

// for programmatically presenting view controller 
// present(viewController, animated: true, completion: nil)

//For Story board segue. you will also have to setup prepare segue for this to work. 
 self?.performSegue(withIdentifier: "Identifier", sender: nil)
  }
}

1

কোনও ধারকটিতে এম্বেড করা ভিউ কন্ট্রোলারের কাছ থেকে সেগ সম্পাদন করার সময় আপনি এই সতর্কতাটি পেতে পারেন। সঠিক সমাধানটি হ'ল কনটেইনারটির ভিউ কন্ট্রোলার থেকে নয়, ধারকটির পিতামাতার কাছ থেকে সেগ ব্যবহার করা।


1

লাইনের নিচে লিখতে হবে।

self.searchController.definesPresentationContext = true

পরিবর্তে

self.definesPresentationContext = true

ইউআইভিউকন্ট্রোলারে


1

সুইফট 3 সহ ...

এটির আর একটি সম্ভাব্য কারণ যা আমার কাছে ঘটেছিল তা স্টিরিবোর্ডের একটি টেবিলভিউসেল থেকে অন্য ভিউকন্ট্রোলারের কাছে সিগ ছিল। override func prepare(for segue: UIStoryboardSegue, sender: Any?) {}সেলটি ক্লিক করার সময় আমিও ব্যবহার করেছি ।

আমি ভিউ কন্ট্রোলার থেকে ভিউ কন্ট্রোলারকে সেগুন করে এই সমস্যাটি সমাধান করেছি।


1

আমার এই সমস্যাটি ছিল এবং মূল কারণটি একাধিকবার একটি বোতাম ক্লিক হ্যান্ডলারের (টাচআউপিআইনসাইড) সাবস্ক্রাইব করছিল।

এটি ভিউউইল অ্যাপয়ারে সাবস্ক্রাইব করছিল, যেহেতু আমরা অন্য একটি নিয়ামকের কাছে যাওয়ার জন্য নেভিগেশন যুক্ত করেছি এবং এরপরে এটি অনিচ্ছাকৃত করার পরে একাধিকবার বলা হয়েছিল।


1

আমার কাছে এটি ঘটেছিল যে স্টোরিবোর্ডে সেগু একরকম ভেঙে গেছে । সেগুটি মোছা (এবং আবার একই একই সেগ তৈরি করা) সমস্যাটি সমাধান করেছে।


1

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

/// independant window for alerts
@interface AlertWindow: UIWindow

+ (void)presentAlertWithTitle:(NSString *)title message:(NSString *)message;

@end

@implementation AlertWindow

+ (AlertWindow *)sharedInstance
{
    static AlertWindow *sharedInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[AlertWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
    });
    return sharedInstance;
}

+ (void)presentAlertWithTitle:(NSString *)title message:(NSString *)message
{
    // Using a separate window to solve "Warning: Attempt to present <UIAlertController> on <UIViewController> whose view is not in the window hierarchy!"
    UIWindow *shared = AlertWindow.sharedInstance;
    shared.userInteractionEnabled = YES;
    UIViewController *root = shared.rootViewController;
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
    alert.modalInPopover = true;
    [alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
        shared.userInteractionEnabled = NO;
        [root dismissViewControllerAnimated:YES completion:nil];
    }]];
    [root presentViewController:alert animated:YES completion:nil];
}

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];

    self.userInteractionEnabled = NO;
    self.windowLevel = CGFLOAT_MAX;
    self.backgroundColor = UIColor.clearColor;
    self.hidden = NO;
    self.rootViewController = UIViewController.new;

    [NSNotificationCenter.defaultCenter addObserver:self
                                           selector:@selector(bringWindowToTop:)
                                               name:UIWindowDidBecomeVisibleNotification
                                             object:nil];

    return self;
}

/// Bring AlertWindow to top when another window is being shown.
- (void)bringWindowToTop:(NSNotification *)notification {
    if (![notification.object isKindOfClass:[AlertWindow class]]) {
        self.hidden = YES;
        self.hidden = NO;
    }
}

@end

বেসিক ব্যবহার যা ডিজাইনের মাধ্যমে সর্বদা সফল হবে:

[AlertWindow presentAlertWithTitle:@"My title" message:@"My message"];

1

দুঃখের বিষয়, গৃহীত সমাধানটি আমার ক্ষেত্রে কার্যকর হয়নি। আমি অন্য ভিউ কন্ট্রোলারের কাছ থেকে উম্মুক্ত হওয়ার পরে সরাসরি একটি নতুন ভিউ কন্ট্রোলারে নেভিগেট করার চেষ্টা করছিলাম।

কোন আনওয়াইন্ড সিগু বলা হয়েছিল তা বোঝাতে একটি পতাকা ব্যবহার করে আমি একটি সমাধান পেয়েছি।

@IBAction func unwindFromAuthenticationWithSegue(segue: UIStoryboardSegue) {
    self.shouldSegueToMainTabBar = true
}

@IBAction func unwindFromForgetPasswordWithSegue(segue: UIStoryboardSegue) {
    self.shouldSegueToLogin = true
}

তারপরে ওয়ান্টেড ভিসি উপস্থাপন করুন present(_ viewControllerToPresent: UIViewController)

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    if self.shouldSegueToMainTabBar {
        let mainTabBarController = storyboard.instantiateViewController(withIdentifier: "mainTabBarVC") as! MainTabBarController
        self.present(mainTabBarController, animated: true)
        self.shouldSegueToMainTabBar = false
    }
    if self.shouldSegueToLogin {
        let loginController = storyboard.instantiateViewController(withIdentifier: "loginVC") as! LogInViewController
        self.present(loginController, animated: true)
        self.shouldSegueToLogin = false
    }
}

মূলত, উপরের কোডটি আমাকে লগইন / সাইনআপ ভিসি থেকে আনইন্ডটি ধরতে এবং ড্যাশবোর্ডে নেভিগেট করতে দেয়, বা পাসওয়ার্ড ভুলে ভুলে যাওয়া থেকে আনইনড ক্রিয়াটি ধরতে এবং লগইন পৃষ্ঠায় নেভিগেট করতে দেয়।


1

শীর্ষস্থানীয় বেশিরভাগ ভিউকন্ট্রোলারকে ধ্রুবক হিসাবে সংরক্ষণ করার মাধ্যমে আমি এই ত্রুটিটি স্থির করেছিলাম যা রুটভিউকন্ট্রোলারের উপর চক্রের মধ্যে পাওয়া যায়:

if var topController = UIApplication.shared.keyWindow?.rootViewController {
    while let presentedViewController = topController.presentedViewController {
        topController = presentedViewController
    }
    topController.present(controller, animated: false, completion: nil)
    // topController should now be your topmost view controller
}

1

আমি এই বাগটি এক্সকোড আপডেট করার পরে এসে দেখেছি, আমি সুইফট 5 তে বিশ্বাস করি । সমস্যাটি তখন ঘটছিল যখন আমি ভিউ কন্ট্রোলারটিকে আনওয়াইন্ড করার পরে প্রগ্রেমেটিকভাবে সরাসরি একটি সেগুন চালু করি।

সম্পর্কিত বাগটি ঠিক করার সময় সমাধানটি উপস্থিত হয়েছিল, এটি হ'ল ব্যবহারকারী এখন পৃষ্ঠাটি নীচে সোয়াইপ করে সেগগুলি খুলে ফেলতে সক্ষম হয়েছিল। এটি আমার প্রোগ্রামটির যুক্তি ভঙ্গ করেছে।

এটা তোলে থেকে সব দৃশ্য কন্ট্রোলার উপর উপস্থাপনা মোড পরিবর্তন করে সংশোধন করা হয়েছে স্বয়ংক্রিয় করার পূর্ণ স্ক্রীণ

আপনি এটি ইন্টারফেস বিল্ডারে অ্যাট্রিবিউটস প্যানেলে করতে পারেন। অথবা কীভাবে এটি অগ্রগতিমূলকভাবে করা যায় তার জন্য এই উত্তরটি দেখুন ।


0

আমার কেবল এই সমস্যাটি ছিল, তবে এটির সময়ের সাথে কোনও সম্পর্ক ছিল না। আমি দৃশ্যগুলি পরিচালনা করতে সিঙ্গলটন ব্যবহার করছিলাম এবং আমি উপস্থাপক হিসাবে সেট করেছিলাম। অন্য কথায় "স্ব" কোনও কিছুর প্রতি আবদ্ধ ছিল না। আমি কেবলমাত্র এর অভ্যন্তরীণ "দৃশ্য" তৈরি করেছি নতুন উপস্থাপক এবং ভয়েলা, এটি কাজ করেছে। (ভয়েলা তার অর্থটি শিখার পরে তার স্পর্শটি হারাতে পারে)

হ্যাঁ, এটি "ম্যাজিকালি সঠিকভাবে সন্ধানের জন্য" নয়, এটি আপনার কোডটি কোথায় রয়েছে এবং এটি কী করছে তা বোঝার বিষয়ে। আমি খুশি হলাম অ্যাপল এমন এক স্পষ্ট-ইংলিশ সতর্কতা বার্তা দিয়েছে, এমনকি এটির সংবেদন সহ। কুডোস আপেল দেব কে কে করেছে !!


0

যদি অন্য সমাধানগুলি কোনও কারণে ভাল না দেখায়, তবে আপনি workaround0 এর বিলম্বের সাথে উপস্থাপনের এই পুরাতনটি এখনও ব্যবহার করতে পারেন :

dispatch_after(0, dispatch_get_main_queue(), ^{
    finishViewController *finished = [self.storyboard instantiateViewControllerWithIdentifier:@"finishViewController"];
    [self presentViewController:finished animated:NO completion:NULL];    
});

যদিও আমি কোনও ডকুমেন্টেড গ্যারান্টি দেখিনি যে প্রেরণের সময় নির্বাহের সময় নির্ধারিত হওয়ার সময় আপনার ভিসি ভিউ হায়ারার্কিতে থাকবে, আমি পর্যবেক্ষণ করেছি যে এটি ঠিক কাজ করবে।

উদাহরণস্বরূপ, 0.2 সেকেন্ডের বিলম্ব ব্যবহার করাও একটি বিকল্প। এবং সর্বোত্তম জিনিস - এইভাবে আপনাকে বুলেয়ান ভেরিয়েবলের সাথে ঝামেলা করতে হবে নাviewDidAppear:


2
এটি এখন কার্যকর হতে পারে, এমন কোনও গ্যারান্টি নেই যে অ্যাপল আচরণ পরিবর্তন করবে এবং ভবিষ্যতে এটি আপনার উপর ভেঙে দেবে। তারপরে আপনি যখন জিনিসগুলি আবার চেষ্টা ও ঠিক করার জন্য আপনার কোডটি দেখতে ফিরে যান তখন আপনি অবাক হবেন যে আপনি কেন এই আপাতদৃষ্টিতে অপ্রয়োজনীয় প্রেরণ করছেন।
ক্রুইনহ

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

2
আপনি কেবল সমস্যাটি হ্যাক করছেন এবং এটি সমাধান করছেন না।
মাইকেল পিটারসন 15

0

এটি কোনও নেভিগেশন নিয়ন্ত্রক উপলব্ধ থাকলে, কোনও ভিউ নিয়ন্ত্রণকারী উপস্থাপনের জন্য কাজ করে। স্ব.নিভিশনকন্ট্রোলার? .প্রিসেন্ট (মাইভিউকন্ট্রোলার, অ্যানিমেটেড: সত্য, সমাপ্তি: শূন্য) এছাড়াও, আমি সতর্কতা এবং মেল নিয়ামকও উপস্থাপন করতে সক্ষম।

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