সমস্ত সাবভিউ মুছে ফেলবেন?


316

যখন আমার অ্যাপ্লিকেশনটি তার মূল দৃশ্যের নিয়ামকটিতে ফিরে আসে, viewDidAppear:পদ্ধতিতে আমাকে সমস্ত সাবভিউ মুছে ফেলতে হবে।

কিভাবে আমি এটি করতে পারব?

উত্তর:


569

সম্পাদনা করুন: কোকোফানকে ধন্যবাদ : এই পরিস্থিতিটি জটিল হয়ে পড়েছে NSViewএবং UIViewবিষয়গুলি আলাদাভাবে পরিচালনা করে handle জন্য NSView(শুধুমাত্র ডেস্কটপ ম্যাক উন্নয়ন), আপনি কেবল নিম্নলিখিত ব্যবহার করতে পারেন:

[someNSView setSubviews:[NSArray array]];

জন্য UIView(শুধুমাত্র আইওএস উন্নয়ন), আপনি নিরাপদে ব্যবহার করতে পারেন makeObjectsPerformSelector:কারণ subviewsসম্পত্তি একটি ফিরে আসবে কপি subviews এর অ্যারের:

[[someUIView subviews]
 makeObjectsPerformSelector:@selector(removeFromSuperview)];

টমিকে ধন্যবাদ জানানোর জন্য ধন্যবাদ যা এটির অঙ্কন করার সময় অ্যারেটি makeObjectsPerformSelector:সংশোধন করতে পারে subviews(যা এটির জন্য NSViewনয় তবে এর জন্য নয় UIView)।

আরও তথ্যের জন্য দয়া করে এই তাই প্রশ্ন দেখুন।

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

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


9
আপনি কি নিশ্চিত যে এটি নিরাপদ? তালিকাটি পুনরাবৃত্তি করার সময় এটি পরিবর্তন করে এবং আমি অ্যাপলের ডকুমেন্টেশনে একটি নির্দিষ্ট বক্তব্য খুঁজে পেতে পারি না।
টমি

8
@ টমি: এটি একটি ভাল বিষয়। কিছু গুগলিং উত্তরটি UIViewফিরিয়ে দিয়েছে : পরিবর্তনীয় অ্যারের একটি অনুলিপি প্রদান করে subviews, সুতরাং এই কোডটি কেবল কাজ করে। ডেস্কটপে সম্পূর্ণ ভিন্ন গল্প, যেখানে একই কোডটি একটি ব্যতিক্রম ছুঁড়ে দেবে। দেখুন stackoverflow.com/questions/4665179/...
e.James

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

4
জ্যামারিন উপায়: কিছু ইউআইভিউ.সুবভিউস.এল (পি => পি। রিমুভ্রোমসপারভিউ);
বেনোইট জাদিনন

3
@ বেনোইটজাদিনন - সংকলন করবে না - আপনি ফোরইচ সম্পাদন করার জন্য সমস্তকে আপত্তিজনক বলে মনে করছেন, তাই someUIView.Subviews.All( v => { v.RemoveFromSuperview(); return true; } );। এই প্রোগ্রামটিতে ক্লিনার বলতে আপনি কি বোঝাতে চেয়েছেন: someUIView.Subviews.ToList().ForEach( v => v.RemoveFromSuperview() );
টুলমেকারস্টেভ

173

আপনার রুট কন্ট্রোলার থেকে সমস্ত সাবভিউ দেখুন এবং প্রতিটি অপসারণ থেকে ফর্মসুপারভিউ:

NSArray *viewsToRemove = [self.view subviews];
for (UIView *v in viewsToRemove) {
    [v removeFromSuperview];
}

+1 এবং আপনাকে ধন্যবাদ। আপনার মতো আমারও ব্যবহার self.viewকরা উচিত ছিল ।
জেমস

2
কেন না!? for (UIView *v in [self.view subviews])এর সহজ
ফ্রেড

4
@ ফ্রেড এটি যেভাবে করেছে তা আরও স্পষ্ট এবং আরও ভার্জোজ।
ভার্বোস

33
@taylorcressy আপনার বলা উচিত ছিল "পাঠযোগ্যতা> কিস্ট্রোক সংরক্ষণ করা" পরিবর্তে "কীস্ট্রোকগুলি সংরক্ষণের চেয়ে পাঠযোগ্যতা আরও গুরুত্বপূর্ণ" এবং তারপরে আপনার মন্তব্যটি আরও পঠনযোগ্য হবে। :-)
আরলোমেডিয়া

1
আসুন এই বিষয়টি ভুলে যাবেন না যে যদি [সেল্ফ.ভিউ সাবভিউ] হুডের নিচে কোনও গণনা সম্পাদন করে, এটি লুপের জন্য সরাসরি রাখার ফলে সেই গণনাগুলি বারবার সম্পাদিত হতে পারে। লুপের আগে এটি ঘোষণা করা কেবলমাত্র একবার সম্পাদিত হবে তা নিশ্চিত করে।
ব্রায়ান সাচেটা 14

116

ইন সুইফট আপনি একটি ব্যবহার করতে পারেন কার্মিক পদ্ধতির ভালো:

view.subviews.forEach { $0.removeFromSuperview() }

একটি তুলনা হিসাবে, অপরিহার্য পদ্ধতির চেহারা হবে:

for subview in view.subviews {
    subview.removeFromSuperview()
}

এই কোড স্নিপেটগুলি কেবল আইওএস / টিভিএস এ কাজ করে তবে ম্যাকোজে কিছুটা আলাদা।


4
(subviews as [UIView]).map { $0.removeFromSuperview() }
13

8
এটি কার্যকরী নয় যেহেতু কোনও ফাংশন কোনও মান দেয় এবং এটি ফলাফলটিকে বাতিল করে দেয় .map। এটি একটি খাঁটি পার্শ্ব প্রতিক্রিয়া এবং view.subviews.forEach() { $0.removeFromSuperview() }
এটির

1
তুমি ঠিকই বলেছ, মার্টিন, আমি তোমার সাথে একমত। আমি ঠিক জানতাম না অ্যারেগুলিতে ফর (প্রতিটি) পদ্ধতি রয়েছে। এটি কখন যুক্ত হয়েছিল বা আমি কেবল এটির তদারকি করেছি? আমি আমার উত্তর আপডেট করেছি!
জিহুত

1
আমি এতটাই অলস যে এমনকি আমি কীভাবে সাবভিউগুলি সাফ করতে জানতাম, তবুও আমি এখানে এসেছি আপনার স্নিপেটটি অনুলিপি / আটকানোর জন্য এবং একটি +1
রেখেছি

13

আপনি যদি নিজের ইউআইভিউতে (এখানে yourView) সমস্ত সাবভিউ মুছে ফেলতে চান তবে আপনার বোতাম ক্লিক করে এই কোডটি লিখুন:

[[yourView subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];

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

5
এটি কীভাবে গ্রহণযোগ্য উত্তরের চেয়ে আরও বেশি সাহায্য করতে পারে: এটি অভিন্ন। কেন এই লিখ?
রামবাতিনো

8

এটি কেবল ওএসএক্সের ক্ষেত্রে প্রযোজ্য যেহেতু আইওএস-এ অ্যারের একটি অনুলিপি রাখা হয়

সমস্ত সংক্ষিপ্তসারগুলি অপসারণ করার সময়, অ্যারের শেষে মুছে ফেলা শুরু করা এবং আপনি শুরুতে না আসা পর্যন্ত মোছা রাখা ভাল ধারণা। কোডের এই দুটি লাইন দিয়ে এটি সম্পাদন করা যেতে পারে:

for (int i=mySuperView.subviews.count-1; i>=0; i--)
        [[mySuperView.subviews objectAtIndex:i] removeFromSuperview];

SWIFT 1.2

for var i=mySuperView.subviews.count-1; i>=0; i-- {
    mySuperView.subviews[i].removeFromSuperview();
}

বা (কম দক্ষ, তবে আরও পাঠযোগ্য)

for subview in mySuperView.subviews.reverse() {
    subview.removeFromSuperview()
}

বিঃদ্রঃ

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

সুতরাং, কোড

[[someUIView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];

ব্যবহার করা উচিত নয়

মেকওবজেক্টস পারফর্মসাইলেক্টর সম্পর্কে অ্যাপল ডকুমেন্টেশন থেকে উদ্ধৃতি :

অ্যারেতে প্রতিটি অবজেক্টকে প্রদত্ত নির্বাচক দ্বারা চিহ্নিত বার্তা প্রেরণ করে, প্রথম অবজেক্টটি দিয়ে শুরু করে অ্যারের মাধ্যমে শেষ অবজেক্টে অবিরত রাখুন।

(যা এই উদ্দেশ্যে ভুল দিক হতে পারে)


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

কিন্তু এই পদ্ধতিটি কল করার সময় কীভাবে ইউআইভিউ-র কোনও উদাহরণ মুছতে পারে? আপনি কি সাবউভিউ অ্যারে থেকে সরিয়েছেন?
শ্রদ্ধেয়

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

1
Gotcha! ধন্যবাদ. আমি মনে করি আপনি আইওএস-এ সাবভিউ অ্যারের একটি অনুলিপি পেয়ে যাচ্ছেন। যাই হোক না কেন, সাবউভিউগুলি মুছে ফেলতে চাইলে নিজেই একটি অনুলিপি তৈরি করা ভাল ধারণা।
শ্রদ্ধেয়

@ সিম্পলবো - আপনি কি গৃহীত উত্তরের উপর ২০১১ সালে লেখা মন্তব্যগুলি পড়েছেন? এই মতামত অনুসারে, আইওএস-এ, [yourView subviews]অ্যারের একটি কপি প্রদান করে, তাই নিরাপদ। (লক্ষ্য করুন যে ওএসএক্স-এ, আপনি যা বলছেন তা সঠিক))
টুলমেকারস্টেভ

4

এই ভাবে সুইফট ২.০ চেষ্টা করুন

view.subviews.forEach { $0.removeFromSuperview() }

2
আমি আগের তারিখের উত্তর তারিখটি দেখছি না? কেন আমার উত্তরের লিঙ্কটি উত্তরটিতে পেস্ট করবেন না?
উইলিয়াম হু

1
ঠিক ... উত্তরটি আপনার আগে পোস্ট করা হয়েছিল তবে forEachভিত্তিক সমাধানটি আপনার পরে যুক্ত করা হয়েছিল, আমি এটি মিস করেছি। দুঃক্ষিত।
ক্রিশ্তিক

4

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

for (UIView *view in [self.view subviews]) 
{
 [view removeFromSuperview];
}

2

সুইফট UIViewএক্সটেনশন ব্যবহার :

extension UIView {
    func removeAllSubviews() {
        for subview in subviews {
            subview.removeFromSuperview()
        }
    }
}

2

উদ্দেশ্য-সিতে, এগিয়ে যান এবং ইউআইভিউ ক্লাসের বাইরে একটি বিভাগ পদ্ধতি তৈরি করুন।

- (void)removeAllSubviews
{
    for (UIView *subview in self.subviews)
        [subview removeFromSuperview];
}

2
view.subviews.forEach { $0.removeFromSuperview() }

2
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
নিক 3500

1

সমস্ত সাবভিউ সিনট্যাক্স অপসারণ করার জন্য:

- (void)makeObjectsPerformSelector:(SEL)aSelector;

ব্যবহার:

[self.View.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

এই পদ্ধতিটি এনএসআরএইচআরএইচ ফাইলের মধ্যে উপস্থিত রয়েছে এবং এনএসআরাই (এনএসইএসটেন্ডেডআরাই) ইন্টারফেস ব্যবহার করে


1

আপনি যদি সুইফ্ট ব্যবহার করছেন তবে এটি এতটা সহজ:

subviews.map { $0.removeFromSuperview }

এটি দর্শনের ক্ষেত্রে অনুরূপ makeObjectsPerformSelector, তবে আরও কিছুটা সুরক্ষার সাথে।


এটি শব্দার্থগতভাবে ভুল, mapএর পার্শ্ব প্রতিক্রিয়া হতে পারে না। এছাড়াও, একই ফলাফল মাধ্যমে অর্জন করা যেতে পারে forEach
ক্রিশ্চিক

0

আইওএস auto এর জন্য অটোলেআউট ব্যবহার করার জন্য আমাকেও বাধাগুলি দূর করতে কিছুটা কোড যুক্ত করতে হয়েছিল।

NSMutableArray * constraints_to_remove = [ @[] mutableCopy] ;
for( NSLayoutConstraint * constraint in tagview.constraints) {
    if( [tagview.subviews containsObject:constraint.firstItem] ||
       [tagview.subviews containsObject:constraint.secondItem] ) {
        [constraints_to_remove addObject:constraint];
    }
}
[tagview removeConstraints:constraints_to_remove];

[ [tagview subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];

আমি নিশ্চিত যে এটি করার জন্য খুব সুন্দর উপায় আছে তবে এটি আমার পক্ষে কাজ করেছে। আমার ক্ষেত্রে আমি সরাসরি ব্যবহার করতে পারিনি [tagview removeConstraints:tagview.constraints]কারণ এক্সকোডে নির্ধারিত প্রতিবন্ধকতাগুলি সাফ হয়ে যাচ্ছিল।



-10

তত্ত্বাবধান থেকে সমস্ত সাবভিউ দেখুন সরানোর জন্য:

NSArray *oSubView = [self subviews];
for(int iCount = 0; iCount < [oSubView count]; iCount++)
{
    id object = [oSubView objectAtIndex:iCount];
    [object removeFromSuperview];
    iCount--;
}

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

5
আপনার প্রতিটি পুনরাবৃত্তি iCount++এবং iCount--সূচকটি একই রেখে, তাই এটি যদি অসীম লুপ হয় [oSubView count]>0। এটি অবশ্যই বগি এবং ব্যবহারযোগ্য কোড নয়
ড্যানিয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.