একটি মতামত একটি ভিউতে আছে কিনা তা পরীক্ষা করুন


97

আমি একটি অ্যাপ্লিকেশন যেখানে আমি ব্যবহার একটি দৃশ্য করার জন্য একটি subview যোগ তৈরি করছি addSubview:একটি অন IBAction। একইভাবে, যখন সেই বোতামটি IBActionআবার স্পর্শ করা হবে তখন removeFromSuperviewসেই সাবভিউটিতে যুক্ত হওয়া উচিত IBAction:

সুডোকোড

-(IBAction)showPopup:(id)sender 
{
    System_monitorAppDelegate *delegate = (System_monitorAppDelegate *)[[UIApplication sharedApplication] delegate];
    UIView *rootView = delegate.window.rootViewController.view;

    if([self popoverView] is not on rootView) 
    { 
        [rootView addSubview:[self popoverView]];
    } 
    else 
    {
        [[self popoverView] removeFromSuperview];
    }

}

উত্তর:


271

আপনি সম্ভবত ইউআইভিউ শ্রেণীর রেফারেন্সে-(BOOL)isDescendantOfView:(UIView *)view; নেওয়া ইউআইভিউয়ের সন্ধান করছেন ।

যদি রিসিভারটি তাত্ক্ষণিকভাবে বা দূরবর্তী দৃশ্যের সাথে দেখা হয় বা যদি ভিউ নিজেই গ্রহণকারীর হয় তবে তার মান প্রত্যাবর্তন করুন ; অন্যথায় না।

আপনি একটি কোড সমাপ্ত হবে:

উদ্দেশ্য গ

- (IBAction)showPopup:(id)sender {
    if(![self.myView isDescendantOfView:self.view]) { 
        [self.view addSubview:self.myView];
    } else {
        [self.myView removeFromSuperview];
    }
}

সুইফট 3

@IBAction func showPopup(sender: AnyObject) {
    if !self.myView.isDescendant(of: self.view) {
        self.view.addSubview(self.myView)
    } else {
        self.myView.removeFromSuperview()
    }
}

4
কাজ করে না, এটির উপরে দৃশ্যটি যুক্ত করে। আমি আসল
কেসটি

@ zad0xsis - আমি আসল ঘটনাটি বুঝতে পারি না। আপনি ব্যবহার দ্বিতীয় দৃশ্য যোগ করেন, তাহলে addSubview:পদ্ধতি, পরের বার (যা সম্ভবত ক্ষেত্রে প্রথমবার হয়), আপনি অন্য অংশ পৌঁছানোর করব দ্বিতীয় দৃশ্য এখন কারণ হল প্রথম একটি subview। তুমি যা করার চেষ্টা করছ তা কি তাই না? আপনি সম্ভবত অন্য কোনও মেকানিজম খুঁজছেন যেমন কোনও ভিউ নিয়ন্ত্রকের উপস্থাপিত করার মতো?

ভাল, popoverViewরুটভিউ (রুটভিউ কনট্রোলার) এর একটি সাবভিউ। আমি এটি স্ক্রিনে আছে কিনা তা পরীক্ষা করতে চাই (যদি এটির সুপারভিউ হিসাবে রুটভিউ রয়েছে) এবং যদি তা অপসারণ করুন বা অন্যটি না হলে এটি যুক্ত করুন
pmerino

হয় [self popoverView]একটি নতুন প্রতিটি সময় popover নির্মিত রিটার্নিং? এটি একই দৃষ্টিভঙ্গি যদি এটির উপরে একটি ভিউ যুক্ত করতে পারে না, এমন দৃশ্য দেখিয়েছে যা ইতিমধ্যে কোনও অপশন নেই। যদি popoverViewপদ্ধতিটি প্রতিবার একটি নতুন তৈরি করে চলেছে , তবে তা সর্বদা দৃষ্টিকোণে হবে না
bshirley

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

18

এটা চেষ্টা কর:

-(IBAction)showPopup:(id)sender
{
    if (!myView.superview)
        [self.view addSubview:myView];
    else
        [myView removeFromSuperview];
}

অসাধারণ! কখনও কখনও এটির জন্য আমারভিউ.ভিউ.সুপারভিউ দরকার, তবে এটি আমার জন্য যাদুর মতো কাজ করেছিল। ধন্যবাদ @MarkGranoff
Lior Frenkel

11
    UIView *subview = ...;
    if([self.view.subviews containsObject:subview]) {
        ...
    }

কাজ করে না, এটির উপরে দৃশ্যটি যুক্ত করে। আমি আসল কেসটি দেখানোর জন্য কোডটি সম্পাদনা করব - zad0xsis 1 min ago edit
pmerino

12
@ পোমারিনো এই অলসতার জন্য অভিনন্দন জানিয়েছেন যে আপনি "zad0xsis 1 মিনিট আগে সম্পাদনা করুন" :-) অনুলিপি করেছেন
টমাস কেকিসেন

আমি মনে করি এটি অন্য সমাধানগুলির তুলনায় সত্যই বেশি ব্যয়বহুল কারণ এটি সমস্ত সাবভিউ দিয়ে পুনরাবৃত্তি করতে হবে
সিম্পলকিউই

4

সুইফ্টের সমতুল্য এইরকম কিছু দেখবে:

if(!myView.isDescendantOfView(self.view)) {
    self.view.addSubview(myView)
} else {
    myView.removeFromSuperview()
}

2

সাবভিউয়ের তদারকি দেখুন ...

-(IBAction)showPopup:(id)sender {
    if([[self myView] superview] == self.view) { 
        [[self myView] removeFromSuperview];           
    } else {
        [self.view addSubview:[self myView]];         
    }
}

1

আপনার যদি অবস্থা ভালো হয়

if (!([rootView subviews] containsObject:[self popoverView])) { 
    [rootView addSubview:[self popoverView]];
} else {
    [[self popoverView] removeFromSuperview];

}

এটি মাইকেল ফ্রেডেরিকের উত্তরের সামান্য পরিবর্তন। এটি কি ভিনসেন্টের কোড থেকে বিভিন্ন ফলাফল দেয় যা ব্যবহার করে isDescendantOfView:?
পৌলমনিকো

এটি একেবারে আলাদা ফলাফল দেয়। এটি কেবলমাত্র চাইল্ড ভিউ, নাতি-নাতি বা নাতি-নাতনী ইত্যাদি নয় কিনা তা পরীক্ষা করে
দেখায়

0

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

if parentView.subviews.contains(descendantView) {
   // descendant view added to the parent view.
}else{
  // descendant view not added to the parent view.
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.