বাতিল করুনমডালভিউকন্ট্রোলার অ্যানিমেটেড অবহ্রাসিত


103

আইফোন 5 এর জন্য 4 ইঞ্চি ডিসপ্লেতে চলার জন্য আমার আইওএস অ্যাপ্লিকেশনটি আপডেট করতে আমি মাত্র XCode 4.5 তে আপগ্রেড করেছি, তবে আমি dismissModalViewControllerAnimated:' is deprecatedলাইনে বলার ক্ষেত্রে একটি বিল্ড ত্রুটি পেয়েছি :

[self dismissModalViewControllerAnimated:NO];

আমি সমাপ্তি হ্যান্ডলারের সাথে প্রস্তাবিত ওভারলোডকে আপডেট করার চেষ্টা করেছি (তবে NULL তে সেট করা) এর মতো:

[self dismissModalViewControllerAnimated:NO completion:NULL];

তবে তারপরে এই লাইনটি দুটি ত্রুটি ছুঁড়েছে:

warning: 'TabBarController' may not respond to '-presentModalViewController:animated:completion:'
Instance method '-presentModalViewController:animated:completion:' not found (return type defaults to 'id')

ধন্যবাদ!

উত্তর:


307

নতুন পদ্ধতিটি হ'ল:

[self dismissViewControllerAnimated:NO completion:nil];

মডেল শব্দটি সরানো হয়েছে; এটি উপস্থাপনকারী এপিআই কলটির জন্য যেমন হয়েছে:

[self presentViewController:vc animated:NO completion:nil];

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

মার্কের মন্তব্যের জবাবে:

৪.৩ বা তার বেশি ডিভাইসগুলির সমর্থন করার সর্বোত্তম উপায় কী? নতুন পদ্ধতি আইওএস 4 এ কাজ করে না, তবুও পুরানো পদ্ধতিটি আইওএস 6-এ অবনতিযুক্ত।

আমি বুঝতে পারি যে এটি প্রায় একটি পৃথক প্রশ্ন, তবে আমি মনে করি এটি উল্লেখ করার মতো যেহেতু প্রতি 3 বছর পর পর তাদের সমস্ত ডিভাইস আপগ্রেড করার জন্য প্রত্যেকেরই অর্থ নেই তাই আমাদের অনেকেরই কিছু পুরানো (5.0 পূর্ববর্তী) ডিভাইস রয়েছে। তবুও, এটি বলার জন্য যতই কষ্ট পেলাম, আপনার এটি বিবেচনা করা উচিত যে এটি 5.0 এর নিচে লক্ষ্য করার মতো কিনা। 5.0 এর নীচে অনেকগুলি নতুন এবং দুর্দান্ত এপিআই উপলব্ধ নেই। এবং অ্যাপল ক্রমাগত তাদের লক্ষ্য করা শক্ত করে তুলছে; উদাহরণস্বরূপ এক্সকোড ৪.৪ থেকে আর্মভি support সমর্থন বাদ দেওয়া হয়েছে।

5.0 এর নীচে লক্ষ্য করতে (যতক্ষণ না সমাপ্তি ব্লক শূন্য থাকে) কেবল হ্যান্ডি respondsToSelector: পদ্ধতিটি ব্যবহার করুন ।

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
    [self presentViewController:test animated:YES completion:nil];
} else {
    [self presentModalViewController:test animated:YES];
}

মার্কের অন্য মন্তব্যের জবাবে:

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

এবং সম্পূর্ণ উত্তম থেকে একটি:

... ম্যানুয়ালি কারণ দেওয়ার কোনও উপায় আছে যে সংকলক সতর্কতাটি উপস্থাপন করবে না?

প্রথমত, না, এর UIViewControllerমধ্যে এবং নিজেই একটি বিভাগ তৈরি করা আপনার অ্যাপ্লিকেশনটিকে প্রত্যাখ্যান করবে না; সেই বিভাগ পদ্ধতিটি প্রাইভেট এপিআই বা অনুরূপ কিছু না বলে।

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

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

আমি যদি এর জন্য একটি সাধারণ বিভাগের পদ্ধতি লিখি তবে এটি এমন কিছু হতে পারে:

@implementation UIViewController (NJ_ModalPresentation)
-(void)nj_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion{
    NSAssert(completion == nil, @"You called %@ with a non-nil completion. Don't do that!",NSStringFromSelector(_cmd));
    if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
        [self presentViewController:viewControllerToPresent animated:flag completion:completion];
    } else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
        [self presentModalViewController:viewControllerToPresent animated:flag];
#pragma clang diagnostic pop
    }
}
@end

2
৪.৩ বা তার বেশি ডিভাইসগুলির সমর্থন করার সর্বোত্তম উপায় কী? নতুন পদ্ধতি আইওএস 4 এ কাজ করে না, তবুও পুরানো পদ্ধতিটি আইওএস 6-এ অবনতিযুক্ত। রক এবং একটি কঠিন জায়গা?
মার্ক

@ মার্ক আপনার উদ্বেগের সমাধান করার জন্য আমার উত্তরটিতে যুক্ত করেছি।
এনজোনস

ধন্যবাদ। আমার আবেদনে যদি বিবৃতি দেওয়া যায় তবে তা অনেকটা হতে পারে! আমার ধারণা, 'মোডালভিউকন্ট্রোলার' সম্পত্তি ব্যবহার করার সময় একই পদ্ধতি কাজ করতে পারে। আমি এই কোডটি এনক্যাপসুলেটেড এমন একটি বিভাগ তৈরি করার কথা ভাবছিলাম, ইউআইভিউউকন্ট্রোলারে কোনও বিভাগ তৈরি করা আমাকে প্রত্যাখ্যান করবে?
মার্ক

কোডের if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){ [self presentViewController:test animated:YES completion:nil]; } else { [self presentModalViewController:test animated:YES]; }জন্য ম্যানুয়ালি কারণ দেওয়ার কোনও উপায় আছে যা সংকলক সতর্কতা উপস্থাপন করবে না?
উইলিয়াম এন্টারিকেন

@ ফুলডিসেন্ট হ্যাঁ আপনি পারেন। আমি তার কিছু তথ্য দিয়ে আমার উত্তর সম্পাদনা করেছি।
এনজোনস

6

এখন আইওএস 6 এবং তারপরে, আপনি ব্যবহার করতে পারেন:

[[Picker presentingViewController] dismissViewControllerAnimated:YES completion:nil];

পরিবর্তে:

[[Picker parentViewControl] dismissModalViewControllerAnimated:YES];

... এবং আপনি ব্যবহার করতে পারেন:

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

পরিবর্তে

[self presentModalViewController:picker animated:YES];    



3

সতর্কতা এখনও আছে। এ থেকে মুক্তি পাওয়ার জন্য আমি এটিকে এটির মতো একটি নির্বাচকের মধ্যে রেখেছি:

if ([self respondsToSelector:@selector(dismissModalViewControllerAnimated:)]) {
    [self performSelector:@selector(dismissModalViewControllerAnimated:) withObject:[NSNumber numberWithBool:YES]];
} else {
    [self dismissViewControllerAnimated:YES completion:nil];
}

এটি আমার মতো ওসিডি সহ লোকদের উপকার করে;)


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

0

এটি আমার মতো অন্যান্য নবাগতকে যদি সহায়তা করে তবে আমি এটি সম্পর্কিত বর্তমান ভিউকন্ট্রোলার সংস্করণটি ব্যবহার করেছি:

if ([self respondsToSelector:@selector(presentModalViewController:animated:)]) {
    [self performSelector:@selector(presentModalViewController:animated:) withObject:testView afterDelay:0];
} else {
    [self presentViewController:configView animated:YES completion:nil];
}
[testView.testFrame setImage:info]; //this doesn't work for performSelector
[testView.testText setHidden:YES];

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

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