যখন আমার অ্যাপ্লিকেশনটি তার মূল দৃশ্যের নিয়ামকটিতে ফিরে আসে, viewDidAppear:
পদ্ধতিতে আমাকে সমস্ত সাবভিউ মুছে ফেলতে হবে।
কিভাবে আমি এটি করতে পারব?
যখন আমার অ্যাপ্লিকেশনটি তার মূল দৃশ্যের নিয়ামকটিতে ফিরে আসে, viewDidAppear:
পদ্ধতিতে আমাকে সমস্ত সাবভিউ মুছে ফেলতে হবে।
কিভাবে আমি এটি করতে পারব?
উত্তর:
সম্পাদনা করুন: কোকোফানকে ধন্যবাদ : এই পরিস্থিতিটি জটিল হয়ে পড়েছে NSView
এবং UIView
বিষয়গুলি আলাদাভাবে পরিচালনা করে handle জন্য NSView
(শুধুমাত্র ডেস্কটপ ম্যাক উন্নয়ন), আপনি কেবল নিম্নলিখিত ব্যবহার করতে পারেন:
[someNSView setSubviews:[NSArray array]];
জন্য UIView
(শুধুমাত্র আইওএস উন্নয়ন), আপনি নিরাপদে ব্যবহার করতে পারেন makeObjectsPerformSelector:
কারণ subviews
সম্পত্তি একটি ফিরে আসবে কপি subviews এর অ্যারের:
[[someUIView subviews]
makeObjectsPerformSelector:@selector(removeFromSuperview)];
টমিকে ধন্যবাদ জানানোর জন্য ধন্যবাদ যা এটির অঙ্কন করার সময় অ্যারেটি makeObjectsPerformSelector:
সংশোধন করতে পারে subviews
(যা এটির জন্য NSView
নয় তবে এর জন্য নয় UIView
)।
আরও তথ্যের জন্য দয়া করে এই তাই প্রশ্ন দেখুন।
দ্রষ্টব্য: এই দুটি পদ্ধতির যে কোনওটি ব্যবহার করা আপনার মূল ভিউটিতে থাকা প্রতিটি দর্শন সরিয়ে ফেলবে এবং সেগুলি অন্য কোথাও ধরে না রাখলে এগুলি মুক্তি দেয় । অপসারণের থেকে অ্যাপলের ডকুমেন্টেশন থেকে ফর্মসুপার্ভিউ :
যদি গ্রাহকের তত্ত্বাবধানটি শূন্য না হয় তবে এই পদ্ধতিটি প্রাপককে মুক্তি দেয়। আপনি যদি ভিউটি পুনঃব্যবহার করার পরিকল্পনা করেন তবে এই পদ্ধতিটি কল করার আগে এটি ধরে রাখার বিষয়ে নিশ্চিত হন এবং এটি সম্পন্ন করার সময় বা এটি অন্য দর্শনের শ্রেণিবিন্যাসে যুক্ত করার পরে যথাযথভাবে ছেড়ে দেওয়ার বিষয়ে নিশ্চিত হন।
UIView
ফিরিয়ে দিয়েছে : পরিবর্তনীয় অ্যারের একটি অনুলিপি প্রদান করে subviews
, সুতরাং এই কোডটি কেবল কাজ করে। ডেস্কটপে সম্পূর্ণ ভিন্ন গল্প, যেখানে একই কোডটি একটি ব্যতিক্রম ছুঁড়ে দেবে। দেখুন stackoverflow.com/questions/4665179/...
someUIView.Subviews.All( v => { v.RemoveFromSuperview(); return true; } );
। এই প্রোগ্রামটিতে ক্লিনার বলতে আপনি কি বোঝাতে চেয়েছেন: someUIView.Subviews.ToList().ForEach( v => v.RemoveFromSuperview() );
।
আপনার রুট কন্ট্রোলার থেকে সমস্ত সাবভিউ দেখুন এবং প্রতিটি অপসারণ থেকে ফর্মসুপারভিউ:
NSArray *viewsToRemove = [self.view subviews];
for (UIView *v in viewsToRemove) {
[v removeFromSuperview];
}
self.view
করা উচিত ছিল ।
for (UIView *v in [self.view subviews])
এর সহজ
ইন সুইফট আপনি একটি ব্যবহার করতে পারেন কার্মিক পদ্ধতির ভালো:
view.subviews.forEach { $0.removeFromSuperview() }
একটি তুলনা হিসাবে, অপরিহার্য পদ্ধতির চেহারা হবে:
for subview in view.subviews {
subview.removeFromSuperview()
}
এই কোড স্নিপেটগুলি কেবল আইওএস / টিভিএস এ কাজ করে তবে ম্যাকোজে কিছুটা আলাদা।
(subviews as [UIView]).map { $0.removeFromSuperview() }
.map
। এটি একটি খাঁটি পার্শ্ব প্রতিক্রিয়া এবং view.subviews.forEach() { $0.removeFromSuperview() }
আপনি যদি নিজের ইউআইভিউতে (এখানে yourView
) সমস্ত সাবভিউ মুছে ফেলতে চান তবে আপনার বোতাম ক্লিক করে এই কোডটি লিখুন:
[[yourView subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
এটি কেবল ওএসএক্সের ক্ষেত্রে প্রযোজ্য যেহেতু আইওএস-এ অ্যারের একটি অনুলিপি রাখা হয়
সমস্ত সংক্ষিপ্তসারগুলি অপসারণ করার সময়, অ্যারের শেষে মুছে ফেলা শুরু করা এবং আপনি শুরুতে না আসা পর্যন্ত মোছা রাখা ভাল ধারণা। কোডের এই দুটি লাইন দিয়ে এটি সম্পাদন করা যেতে পারে:
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় সম্পর্কযুক্ত অন্য কোনও জীবন্ত দৃষ্টান্ত না থাকে তবে ইউআইভিউও মুছে ফেলা হবে। এটি একটি সীমাবদ্ধ ব্যতিক্রম হতে পারে।
[yourView subviews]
অ্যারের একটি কপি প্রদান করে, তাই নিরাপদ। (লক্ষ্য করুন যে ওএসএক্স-এ, আপনি যা বলছেন তা সঠিক))
এই ভাবে সুইফট ২.০ চেষ্টা করুন
view.subviews.forEach { $0.removeFromSuperview() }
forEach
ভিত্তিক সমাধানটি আপনার পরে যুক্ত করা হয়েছিল, আমি এটি মিস করেছি। দুঃক্ষিত।
সমস্ত সাবভিউ মুছে ফেলতে নিম্নলিখিত কোডটি ব্যবহার করুন।
for (UIView *view in [self.view subviews])
{
[view removeFromSuperview];
}
সমস্ত সাবভিউ সিনট্যাক্স অপসারণ করার জন্য:
- (void)makeObjectsPerformSelector:(SEL)aSelector;
ব্যবহার:
[self.View.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
এই পদ্ধতিটি এনএসআরএইচআরএইচ ফাইলের মধ্যে উপস্থিত রয়েছে এবং এনএসআরাই (এনএসইএসটেন্ডেডআরাই) ইন্টারফেস ব্যবহার করে
আপনি যদি সুইফ্ট ব্যবহার করছেন তবে এটি এতটা সহজ:
subviews.map { $0.removeFromSuperview }
এটি দর্শনের ক্ষেত্রে অনুরূপ makeObjectsPerformSelector
, তবে আরও কিছুটা সুরক্ষার সাথে।
map
এর পার্শ্ব প্রতিক্রিয়া হতে পারে না। এছাড়াও, একই ফলাফল মাধ্যমে অর্জন করা যেতে পারে forEach
।
আইওএস 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]
কারণ এক্সকোডে নির্ধারিত প্রতিবন্ধকতাগুলি সাফ হয়ে যাচ্ছিল।
মনোোটুচ / xamarin.ios এ এটি আমার জন্য কাজ করেছে:
SomeParentUiView.Subviews.All(x => x.RemoveFromSuperview);
তত্ত্বাবধান থেকে সমস্ত সাবভিউ দেখুন সরানোর জন্য:
NSArray *oSubView = [self subviews];
for(int iCount = 0; iCount < [oSubView count]; iCount++)
{
id object = [oSubView objectAtIndex:iCount];
[object removeFromSuperview];
iCount--;
}
iCount++
এবং iCount--
সূচকটি একই রেখে, তাই এটি যদি অসীম লুপ হয় [oSubView count]>0
। এটি অবশ্যই বগি এবং ব্যবহারযোগ্য কোড নয় ।