উপস্থাপিত ভিউ কন্ট্রোলারকে বরখাস্ত করা হচ্ছে


116

আমার একটি তাত্ত্বিক প্রশ্ন আছে। এখন আমি অ্যাপলের ভিউকন্ট্রোলার গাইড পড়ছি ।

তারা লিখেছে:

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

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

[self dismissViewControllerAnimated:NO completion:nil]?

প্রথম পছন্দটি আরও ভাল কেন? অ্যাপল কেন এটি সুপারিশ করে?

উত্তর:


122

আমি মনে করি এপিএলের একটি সম্ভাব্য কুল্গি পিসের জন্য অ্যাপল তাদের পিঠে কিছুটা coveringেকে রাখছে।

  [self dismissViewControllerAnimated:NO completion:nil]

আসলে এক ঝাঁকুনির কিছুটা। যদিও আপনি - বৈধভাবে - উপস্থাপিত ভিউ কন্ট্রোলারে কল করতে পারেন, এটি যা কিছু করে তা উপস্থিত উপস্থাপনা নিয়ন্ত্রকের কাছে বার্তা প্রেরণ করা। আপনি যদি কেবল উপাচার্যকে বরখাস্ত করে উপরোক্ত কিছু করতে চান তবে আপনার এটি জানতে হবে এবং আপনাকে এটি প্রতিনিধি পদ্ধতির মতোই একইরকম আচরণ করতে হবে - এটি যা কিছুটা ঠিক ততই জটিল, কিছুটা জটিল নয় প্রতিনিধি পদ্ধতি।

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

তবে অবশ্যই, যদি আপনাকে যা করতে হবে তা যদি বরখাস্ত হয় তবে এগিয়ে যান।

আমার নিজস্ব দৃষ্টিভঙ্গি একটি আপস, কমপক্ষে এটি আমাকে কী ঘটছে তা মনে করিয়ে দেয়:

  [[self presentingViewController] dismissViewControllerAnimated:NO completion:nil]

[সুইফট]

  self.presentingViewController?.dismiss(animated: false, completion:nil)

26
এটি লক্ষ করা উচিত যে ব্যবহার presentingViewControllerকরা বেশিরভাগই অকেজো কারণ এটি একটিতে এমবেড করা UINavigationControllerথাকলে এটি উল্লেখ করবে self। কোন ক্ষেত্রে, আপনি এটি আদৌ পেতে সক্ষম হবেন না presentingViewController। তবুও, [self dismissViewControllerAnimated:completion]এখনও সেই ক্ষেত্রে কাজ করে। আমার পরামর্শ হ'ল অ্যাপল এটি ঠিক না করা পর্যন্ত এটি ব্যবহার করা চালিয়ে যাবেন।
স্মারক

4
আমি পছন্দ করি যে এই উত্তরটি 3 বছর পরে এখনও সম্পূর্ণ প্রাসঙ্গিক।
ব্যবহারকারী 1021430

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

51

সুইফট 3-এর জন্য আপডেট করা হয়েছে

আমি এখানে বর্তমান (উপস্থাপিত) দেখুন কন্ট্রোলারকে খারিজ করতে চাইছি came আমি এখানে একই উদ্দেশ্যে যে কেউ আসবে তাদের জন্য এই উত্তরটি তৈরি করছি।

নেভিগেশন নিয়ন্ত্রক

আপনি যদি নেভিগেশন নিয়ামক ব্যবহার করে থাকেন তবে তা বেশ সহজ।

পূর্ববর্তী ভিউ নিয়ন্ত্রকের কাছে ফিরে যান:

// Swift
self.navigationController?.popViewController(animated: true)

// Objective-C
[self.navigationController popViewControllerAnimated:YES];

রুট ভিউ কন্ট্রোলারে ফিরে যান:

// Swift
self.navigationController?.popToRootViewController(animated: true)

// Objective-C
[self.navigationController popToRootViewControllerAnimated:YES];

( উদ্দেশ্য-সি এর জন্য এই উত্তরের জন্য ধন্যবাদ ।)

মডেল ভিউ কন্ট্রোলার

যখন একটি ভিউ কন্ট্রোলার মোডলি উপস্থাপন করা হয়, আপনি কল করে এটি (দ্বিতীয় দফার নিয়ন্ত্রক থেকে) বরখাস্ত করতে পারেন

// Swift
self.dismiss(animated: true, completion: nil)

// Objective-C
[self dismissViewControllerAnimated:YES completion:nil];

ডকুমেন্টেশন বলছেন,

উপস্থাপনা করা ভিউ কন্ট্রোলার এটি উপস্থাপিত দর্শন নিয়ামককে বরখাস্ত করার জন্য দায়বদ্ধ। আপনি যদি এই পদ্ধতিটি উপস্থাপিত ভিউ কন্ট্রোলারে নিজে কল করেন তবে ইউআইকিট উপস্থাপনার ভিউ কন্ট্রোলারকে বরখাস্ত পরিচালনা করতে বলে।

সুতরাং উপস্থাপিত ভিউ কন্ট্রোলারের পক্ষে এটি কল করার জন্য এটি কাজ করে। এখানে একটি সম্পূর্ণ উদাহরণ।

প্রতিনিধিদের

ওপির প্রশ্নটি একটি মতামত বরখাস্ত করার জন্য প্রতিনিধিদের ব্যবহারের জটিলতা সম্পর্কে ছিল।

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


50

এটি দেখার নিয়ামক পুনরায় ব্যবহারযোগ্যতার জন্য।

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

একটি প্রোটোকল প্রয়োগ করে, আপনি প্যারেন্ট ভিউ কন্ট্রোলারকে এটি কীভাবে উপস্থাপন / ধাক্কা দিয়ে এবং বরখাস্ত / পপ করা উচিত তা সিদ্ধান্ত নিতে দেন।



6

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

সম্পাদনা:

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


তবে যদি আমার "বিভিন্ন ভিউ থেকে বরখাস্ত করার সময় আলাদা আলাদা ডেটা পাস করার প্রয়োজন হয় না, বরখাস্ত করার সময় বিভিন্ন পদ্ধতি কল করা হয় ইত্যাদি" যদি আমি উপস্থাপিত ভিউ কন্ট্রোলার পদ্ধতিতে একটি সামান্য কল করতে পারি - [স্বীকৃত ভিউকন্ট্রোলার অ্যানিমেটেড: কোন সমাপ্তি: নিল]?
নিকিতাহিল

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

2

ভিউ কন্ট্রোলার প্রোগ্রামিং গাইডের উদ্ধৃতি , "কীভাবে নিয়ন্ত্রণকারীরা অন্য দেখুন নিয়ন্ত্রকদের উপস্থাপন করে"।

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

সুতরাং একদিকে এটি একটি দুর্দান্ত ভারসাম্যপূর্ণ নকশা, ভাল ডি-কাপলিং ইত্যাদি তৈরি করে ... তবে অন্যদিকে এটি খুব ব্যবহারিক, কারণ আপনি দ্রুত নেভিগেশনে একটি নির্দিষ্ট পয়েন্টে ফিরে যেতে পারেন।

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


2

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

সুতরাং, ভিউ উপস্থাপন করা ভিউ কন্ট্রোলারটি এটিকে খারিজ করা উচিত।

যেমন, কোনও রিয়েল এস্টেট সংস্থার যিনি ভাড়ায় বাড়ি দেন তা আবার ফিরিয়ে নেওয়ার কর্তৃত্ব হওয়া উচিত।


2

সুইফট ৩.০ // সুইফটে ভিউ কন্ট্রোলারটিকে খারিজ করুন

self.navigationController?.popViewController(animated: true)
dismiss(animated: true, completion: nil)

1

মাইকেল এনরিকিজের উত্তর ছাড়াও, আমি অনির্ধারিত রাষ্ট্র থেকে নিজেকে রক্ষা করার জন্য এটি একটি ভাল উপায় কারণ অন্য একটি কারণ সম্পর্কে ভাবতে পারি:

বলুন ভিউকন্ট্রোলারএ ভিউকন্ট্রোলারবি মডেল উপস্থাপন করে। তবে, যেহেতু আপনি ভিউকন্ট্রোলারের জন্য কোডটি না লিখে থাকতে পারেন আপনি ভিউকন্ট্রোলারএর জীবনচক্র সম্পর্কে অবগত নন। এটি আপনার ভিউ কন্ট্রোলার, ভিউকন্ট্রোলারবি উপস্থাপনের পরে 5 সেকেন্ড (বলুন) খারিজ করে দিতে পারে।

এই ক্ষেত্রে, আপনি যদি dismissViewControllerনিজেকে খারিজ করার জন্য কেবলমাত্র ভিউকন্ট্রোলারবি ব্যবহার করে থাকেন তবে আপনি একটি অপরিজ্ঞাত অবস্থায় পৌঁছে যাবেন - সম্ভবত ক্র্যাশ বা কালো পর্দা নয় তবে আপনার দৃষ্টিকোণ থেকে একটি অপরিজ্ঞাত রাষ্ট্র state

যদি পরিবর্তে, আপনি প্রতিনিধি প্যাটার্নটি ব্যবহার করছিলেন তবে আপনি ভিউকন্ট্রোলারবি'র অবস্থা সম্পর্কে অবহিত হবেন এবং আমি বর্ণিত একটি মামলার জন্য আপনি প্রোগ্রাম করতে পারেন।


1

দ্রুতগতি

let rootViewController:UIViewController = (UIApplication.shared.keyWindow?.rootViewController)!

        if (rootViewController.presentedViewController != nil) {
            rootViewController.dismiss(animated: true, completion: {
                //completion block.
            })
        }

0

আপনি যদি ব্যবহার করছেন মডেল ব্যবহার দেখুন বরখাস্ত।

[self dismissViewControllerAnimated:NO completion:nil];

এটি কীভাবে এই প্রশ্নের উত্তর দেয়: "প্রথম পছন্দটি কেন ভাল? অ্যাপল কেন এটি সুপারিশ করে?"
jww

0

এটি অনেকটা ব্যালনি। প্রয়োজনে ডেলিগেশন ঠিক আছে তবে যদি কোডটি আরও জটিল করে তোলে - এবং এটি করে - তবে এর কারণ হওয়ার দরকার আছে।

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

প্রোটোকলগুলি যখন প্রয়োজন হয় তারা দুর্দান্ত হন তবে অবজেক্ট অরিয়েন্টেড ডিজাইনটি মডিউলগুলি একে অপরের সাথে অযথা যোগাযোগ করার বিষয়ে ছিল না was

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


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

-2

আপনি আপনার সুপার ভিউ উইন্ডোটি বন্ধ করতে পারেন

self.view.superview?.window?.close()

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