সতর্কতা: -বিযুক্ত ভিউ কন্ট্রোলারগুলিতে উপস্থিত ভিউ কন্ট্রোলারদের নিরুৎসাহিত করা হয়েছে


180

আমার অ্যাপে, আমি একটি নেভিগেশন নিয়ামক ব্যবহার করছি। পরে কিছু দৃশ্যে আমি presentViewControllerএকটি জুমযুক্ত চিত্র দেখানোর জন্য ব্যবহার করছি। এছাড়াও আমি স্টোরিবোর্ড বা নিব ব্যবহার করছি না।

আমি কেবল আইওএস 7 এ এই ত্রুটিটি পাচ্ছি। এটি আইওএস 6 এবং এর আগেও দুর্দান্ত কাজ করে:

বিচ্ছিন্ন দর্শন নিয়ন্ত্রকদের উপরে প্রদর্শন নিয়ন্ত্রণকারীদের উপস্থাপন করা নিরুৎসাহিত করা হয়


আমি এখনও খুঁজে না। তবে আমার অ্যাপ্লিকেশনটিতে আমি উইন্ডো.রোটভিউ কনট্রোলারকে কোনও ভিউকন্ট্রোলার নিয়োগ দিচ্ছি না। আমি উইন্ডোতে ভিউ যুক্ত করছি। এটা আমার জন্য কারণ হতে পারে। তবে নিশ্চিত নয় ...
গগন জোশী

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

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

উত্তর:


207

একটি ধাক্কা নেভিগেশন সতর্কতা পেতে এড়াতে, আপনি সরাসরি ব্যবহার করতে পারেন:

[self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil];

এবং তারপরে আপনার মডেল ভিউ কন্ট্রোলারে, যখন সবকিছু শেষ হয়, আপনি কেবল কল করতে পারেন:

[self dismissViewControllerAnimated:YES completion:nil];


আমি এই লাইন কোডের সাথে চিত্র চয়নকারী উপস্থাপন করছি "" [স্ব.উইউ.উইনড.উআরটিভিউ কনট্রোলার উপস্থিতি ভিউকন্ট্রোলার: ভিউকন্ট্রোলার অ্যানিমেটেড: হ্যাঁ সমাপ্তি: শূন্য]; " তবে এই লাইনের সাথে পোকার দর্শনকে বরখাস্ত করতে অক্ষম "[স্ব-বরখাস্ত ভিউকন্ট্রোলার অ্যানিমেটেড: হ্যাঁ সমাপ্তি: শূন্য];" বরখাস্ত নিয়ন্ত্রকের জন্য যে কোনও বিকল্প বিকল্প
কেবি 920

@keyurbhalodiya আপনার কাজটি করার জন্য মোডালভিউ থেকে বরখাস্ত ভিউকন্ট্রোলার পদ্ধতিটি কল করতে হবে। সুতরাং আপনি যদি [ভিউএউডাউন.রোটভিউ কনট্রোলার উপস্থিত ভিউ কনট্রোলার: ভিউবি] সহ একটি ভিউ থেকে ভিউবি নামের একটি ভিউ প্রদর্শন করেন তবে ভিউবিতে আপনাকে একটি কাস্টম অ্যাকশন কলিংয়ের সাথে সম্পর্কিত [স্বতঃসম্পূর্ণ ভিউকন্ট্রোলার অ্যানিমেটেড] সম্পর্কিত একটি বোতাম যুক্ত করতে হবে। এটা কি পরিষ্কার?
সিডিসকোর্স

11
আইওএস ৮ এ ভিউ কন্ট্রোলার উপস্থাপন করছেন না
রাজেশ

1
আইওএস 8 এর জন্য: [self.view.window.rootViewController.navicationController
ফেডার কুগলিয়ানোলো

31
self.navigationControllerআমার জন্য এটি ব্যবহার করে ।
ব্র্যান্ডন জ্যাকারি

62

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

মাস্টার বিস্তারিত দেখুন

এবং এটি এড়াতে, আপনি চাইল্ডভিউ কনট্রোলারের পিতামাতার উপর একটি দৃশ্য উপস্থাপন করতে পারেন

  [self.parentViewController presentViewController:viewController animated:YES completion:nil];

1
[সেল্ফ.ভিউ.উন্ডো.রুটভিউ কনট্রোলারআরভিগেশন কন্ট্রোলার পুশভিউ কনক্রোলার: আপনার_র_ভিউ_কন্ট্রোলার অ্যানিমেটেড: হ্যা];
ফেড কুগলিয়ানোলো

1
"একটি ছোট দৃশ্যের উপরে একটি ভিউ কন্ট্রোলার উপস্থাপন করছিল যা পুরো আকারের দর্শন নয়" " ... ঠিক চমৎকার কাজ.
ফ্যাটি

59

এর জন্য অপেক্ষা করুন viewDidAppear():

আপনি যদি ভিউ কন্ট্রোলারটি দর্শনটি উপস্থিত হওয়ার আগে উপস্থিত করার চেষ্টা করছেন, উদাহরণস্বরূপ viewWillAppear()বা তার আগে দৃশ্য উপস্থাপন করার চেষ্টা করছেন তবে এই ত্রুটিটিও দেখা দিতে পারে । এর বাইরে viewDidAppear()বা এর ভিতরে অন্য কোনও দৃশ্য উপস্থাপনের চেষ্টা করুন ।


9
অন্য কথায় viewDidLoad(), লোকেরা কোনও ভিউ কন্ট্রোলার উপস্থাপন করবেন না ! আমি এই ভুলটি অনেকবার করেছি ...
টি ফাঁকা

ধন্যবাদ এটি সাহায্য করেছে। আমার ভিডডিডোডে কোড ছিল যেখানে এটি শেষে একটি ডায়ালগ প্রদর্শন করার চেষ্টা করেছিল।
আর্দেনদেভ

ইউনিট / ইন্টিগ্রেশন পরীক্ষা চালানোর সময় আমি এই ত্রুটিটি পাচ্ছি যেখানে আমি অ্যানিমেশনগুলির সাথে পরীক্ষা করি না।
mixtly87

21

আমার ক্ষেত্রে, আমি sampleViewControllerএকটি মতামতটিকে একটি সংক্ষিপ্তসার হিসাবে যুক্ত করেছি , তারপরে sampleViewController(এখানে selfপরিবর্তে UIViewControllerউদাহরণ হিসাবে) ভিউ থেকে একটি পপওভার উপস্থাপন করার চেষ্টা করেছি :

[self.view addSubview:sampleViewController.view];

সঠিক উপায় নীচে হওয়া উচিত:

// make sure the vc has been added as a child view controller as well
[self addChildViewController:sampleViewController];
[self.view addSubview:sampleViewController.view];
[sampleViewController didMoveToParentViewController:self];

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


এর সাথে ডডমোভটোপ্যারেন্টভিউ কন্ট্রোলারকেও কল করুন। অনুগ্রহ করে চাইল্ডভিউ
জেকাহাও

@ জিয়ানজং আমার মনে আছে শেষ পদক্ষেপটি করার দরকার নেই। যে কোনও উপায়ে, আমাকে এটি যোগ করতে দিন, ধন্যবাদ। :)
কুজুলি

হ্যাঁ এটি শেষ ধাপ ছাড়া কাজ করবে। আমি মনে করি এর উদ্দেশ্য হ'ল প্যারেন্ট ভিউকন্ট্রোলারকে অবহিত করা যাতে এটি কিছু করার জন্য কিছু পদ্ধতি কল করে। :)
জাকাহাও

2
এটি আমার পক্ষে কাজ করে, আমি অন্য নিয়ামক হিসাবে একটি নিয়ামক দর্শন ব্যবহার করে - ( [self addChildViewController:sampleViewController];
ধারকতাটি প্রোগ্রোলিকভাবে

16

আমি মনে করি যে সমস্যাটি হ'ল আপনার কাছে একটি সঠিক ভিউ নিয়ন্ত্রক শ্রেণিবিন্যাস নেই। অ্যাপ্লিকেশনটির রুটভিউ কনট্রোলার সেট করুন এবং তারপরে নতুন ভিউ কন্ট্রোলারগুলিকে পুশ করে বা উপস্থাপন করে নতুন দর্শনগুলি প্রদর্শন করুন। প্রতিটি দেখার নিয়ন্ত্রককে তাদের মতামত পরিচালনা করতে দিন। কেবলমাত্র ধারক দেখার নিয়ন্ত্রকগণ, যেমন ট্যাব ভিউ কনট্রোলারের মতো, তাদের নিজস্ব দৃষ্টিতে অন্য ভিউ কন্ট্রোলার দর্শন যুক্ত করা উচিত। কিভাবে ভিউ কন্ট্রোলারগুলি সঠিকভাবে ব্যবহার করতে হয় সে সম্পর্কে আরও জানতে ভিউ কন্ট্রোলার প্রোগ্রামিং গাইডটি পড়ুন। https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/


14

সুইফট 3

যে কেউ এ নিয়ে হোঁচট খাচ্ছে তার জন্য এখানে দ্রুত উত্তর answer

self.parent?.present(viewController, animated: true, completion: nil)

9

আমার প্রায় একই সমস্যা কারণটি হ'ল আমি অন্যটিতে "কিছু" নিয়ন্ত্রক উপস্থাপন করার চেষ্টা করেছি এবং অ্যানিমেশন সম্পন্ন হওয়ার পরে আমি উপস্থাপিত নিয়ামককে মূল হিসাবে সেট করছিলাম। এই অপারেশনের পরে উপস্থাপিত আরও সমস্ত কন্ট্রোলার আমাকে এই সতর্কবাণীতে নিয়ে আসে: " বিচ্ছিন্ন দৃষ্টিভঙ্গি নিয়ন্ত্রণকারীদের উপর উপস্থাপনা প্রদর্শন নিয়ন্ত্রকদের নিরুৎসাহিত করা হয় "। এবং আমি এই সতর্কতাটি সমাধান করি কেবল কোনও প্রারম্ভিক সময়ে কোনও উপস্থাপনা ছাড়াই "কিছু" নিয়ামককে রুট হিসাবে সেটিংস করে।

সরানো হয়েছে:

[[self rootController] presentViewController:controller animated:YES completion:^{

       [self window].rootViewController = controller;

       [[self window] makeKeyAndVisible];}];

কোনও উপস্থাপনা ছাড়াই কেবল রুট হিসাবে তৈরি করুন:

 [[self window] setRootViewController:controller];

1
এটা ঠিক আমার সমস্যা ছিল। এটি একটি ইউআইমোডাল ট্রান্সসিশনস্টাইলক্রসড ডিসলভের সাথে উপস্থাপন করার চেষ্টা করছিল এবং তারপরে এটিকে রুট ভিউকন্ট্রোলার হিসাবে তৈরি করার চেষ্টা করছিল। এর পরে, প্রদত্ত সতর্কতা বার্তায় অন্য সমস্ত উপস্থাপনা ব্যর্থ হয়েছিল। অ্যানিমেশন ছাড়াই কেবল এটি রুটভিউ নিয়ন্ত্রণকারী হিসাবে সেট করা কৌশলটি করেছে did ধন্যবাদ!
বার্নার্ডো অলিভিয়রা

7

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

[self.parentViewController presentViewController:viewController animated:YES completion:nil];

এবং বরখাস্ত করার জন্য একই বরখাস্ত নিয়ন্ত্রক ব্যবহার করুন।

[self dismissViewControllerAnimated:YES completion:nil];

এটি নিখুঁত সমাধান আমার জন্য কাজ করে।


7

[self.navigationController presentViewController:xxx animated:YES completion:nil]আইওএস 8 এ ব্যবহার করুন ।


5

এই কোড ব্যবহার করে দেখুন

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:<your ViewController object>];

[self.view.window.rootViewController presentViewController:navigationController animated:YES completion:nil];

4

TabBarControllerএটি যদি কোনও TabBarControllerভিত্তিক অ্যাপ হয় তবে উপস্থাপনের চেষ্টা করুন।

[self.tabBarController presentViewController:viewController animated:YES completion:nil];

কারণ selfসন্তানের হতে পারে TabBarControllerএবং আপনি একটি থেকে উপস্থাপন করার চেষ্টা করছেন ChildViewController


4

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

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

3

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

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

আপনাকে এরকম কিছু লিখতে হবে:

[self addChildViewController:controllerA]; //self is yourMainViewController
[self.view addsubView:controllerA.view]; 

এবং কন্ট্রোলারের মধ্যে আপনি কোনও সতর্কতা ছাড়াই নতুন নিয়ন্ত্রক উপস্থাপন করতে পারেন

[self presentViewController:controllerB animated:YES completion:nil]; //self is controllerA

3

সুইফটে 4.1 এবং এক্সকোড 9.4.1 এ

সমাধানটি হ'ল

DispatchQueue.main.async(execute: {
    self.present(alert, animated: true)
})

এভাবে লিখলে আমিও ত্রুটি পাচ্ছি getting

let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
    })
alert.addAction(defaultAction)

present(alert, animated: true, completion: nil) 

আমি একই ত্রুটি পাচ্ছি

Presenting view controllers on detached view controllers is discouraged <MyAppName.ViewController: 0x7fa95560Z070>.

সম্পূর্ণ সমাধান হয়

let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
     })
alert.addAction(defaultAction)
//Made Changes here    
DispatchQueue.main.async(execute: {
    self.present(alert, animated: true)
})

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

1

শুরু করার জন্য আপনার কাছে কোনও রুট ভিউ কন্ট্রোলার রয়েছে তা নিশ্চিত করুন। আপনি এটি সেট করতে পারেন didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    [window setRootViewController:viewController];
}

1

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


1

আমি এই থ্রেডে পৌঁছেছি যেখানে আমার একটি কাস্টম নেভিগেশন বার রয়েছে এবং আমি এটির মাধ্যমে একটি সতর্কতাউইগ কন্ট্রোলারকে কল করছিলাম।

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

আপনার Zoomed Image View Controllerপ্রধান ভিউ কন্ট্রোলারের শিশু হিসাবে আপনার যুক্ত করা উচিত ।

(যেমন)

[self addChildViewController:ZoomedImageViewController];

তারপরে আপনি নিজের জুমডআইমেজভিউ কনট্রোলারকে কল করতে সক্ষম হবেন

[self presentViewController:ZoomedImageViewController];

1

অনেক উত্তর সঠিক।

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

আমার সহকর্মী যখন বিভিউকন্ট্রোলারে একটি অ্যাভিউকন্ট্রোলার যুক্ত করে তখন এই সমস্যাটি আমার কাছে ঘটেছিল। একরকম, তিনি কেবল বিভিউকন্ট্রোলারের দর্শনে অ্যাভিউকন্ট্রোলারের দৃশ্য যুক্ত করেছেন।

BViewController.addChild (aViewController) দ্বারা সংশোধন করা হয়েছে


1
ধন্যবাদ! আমার Hero.shared.transition সমাপ্তি ব্লকে অ্যাডচিল্ড যুক্ত করা আমার সমস্যার সম্পূর্ণ সমাধান করেছে।
landnbloc

0

আপনি যদি নিজের সতর্কতা বা অন্যরকম কিছু ইউআইভিউউকন্ট্রোলারের কোথাও অনুরূপ কিছু দেখাতে চান তবে এটি নির্ভর করে।

আপনি এই কোড উদাহরণ ব্যবহার করতে পারেন:

UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Example" preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:nil];

[alert addAction:cancelAction];


[[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:alert animated:true completion:nil];

আপনার কোড সহ, এটি কাজ করে না এবং এই লগটি দেয়Attempt to present <UIAlertController: 0x7fc01a1eb600> on <ViewController: 0x7fc019821e00> whose view is not in the window hierarchy!
নাভেদ আব্বাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.