কীভাবে সুইফটে কোনও দৃশ্যের সমস্ত সংক্ষিপ্তসার মুছবেন?


176

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

//I'm trying something like this, but is not working
let theSubviews : Array = container_view.subviews
for (view : NSView) in theSubviews {
    view.removeFromSuperview(container_view)
}

আমি কী মিস করছি?

হালনাগাদ

আমার অ্যাপ্লিকেশন একটি প্রধান আছে container_viewcontainer_viewএক ধরণের নেভিগেশন সরবরাহ করতে আমাকে সাবউভিউ হিসাবে অন্যান্য অন্যান্য মতামত যুক্ত করতে হবে।

সুতরাং, কোনও নির্দিষ্ট পৃষ্ঠাটি "খুলতে" বোতামটি ক্লিক করার সময়, আমাকে অ্যালসউভিউগুলি সরিয়ে নতুন পৃষ্ঠাটি যুক্ত করতে হবে।

আপডেট 2 - একটি কাজের সমাধান (ওএস এক্স)

আমার ধারণা অ্যাপল ঠিক করে দিয়েছে

এখন এটি আগের চেয়ে আরও সহজ, কেবল কল করুন:

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

2
আমি এটি উল্লেখ করতে চাই যে @ সুলতানের উত্তরটি, চিরাচরিতদের সাথে সমাহিত করার সময়, এটি সর্বোত্তম উত্তর: স্ট্যাকওভারফ্লো
ক্রিস্টোফার স্বাসে

@ ক্রিস্টোফারস্বেসি সুইফ্ট 4 ত্রুটি দেয়: সম্পত্তিকে বরাদ্দ করতে পারে না: 'সাবউভিউগুলি' কেবলমাত্র একটি সম্পত্তি। :(
উইলিয়াম টি। ম্যালার্ড

2
@ উইলিয়ামটি.ম্যালার্ড কতবার পুনরাবৃত্তি করতে হবে যে এই পদ্ধতি এবং প্রশ্নটি ম্যাকোস এবং আইওএস সম্পর্কে নয়?
ফোগমিস্টার

উত্তর:


358

সম্পাদনা: (ধন্যবাদ জেরেমিয়া / রোলো)

আইওএসের জন্য সুইফটে এটি করার সর্বোত্তম উপায় হ'ল:

view.subviews.forEach({ $0.removeFromSuperview() }) // this gets things done
view.subviews.map({ $0.removeFromSuperview() }) // this returns modified array

Features এই বৈশিষ্ট্যগুলি মজাদার!

let funTimes = ["Awesome","Crazy","WTF"]
extension String { 
    func readIt() {
        print(self)
    }
}

funTimes.forEach({ $0.readIt() })

//// শেষ সম্পাদনা

শুধু এটি করুন:

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

অথবা আপনি যদি একটি নির্দিষ্ট শ্রেণীর সন্ধান করছেন

for view:CustomViewClass! in self.view.subviews {
        if view.isKindOfClass(CustomViewClass) {
            view.doClassThing()
        }
    }

এক্সকোড 7.0 বিটা 6 এ এটি একটি সতর্কতা উত্পন্ন করে: "'মানচিত্রে' কল করার ফলাফল অব্যবহৃত"। আমি আশা করি এটি চূড়ান্ত সংস্করণে ঠিক হয়ে গেছে।
ফার্সে নায়েজ

আমি পাশাপাশি লক্ষ্য করেছি যে! এক্সকোড বিটা থেকে বের হয়ে আসার পরে আমি পোস্টটি আপডেট করব এবং সমস্যাটি এখনও অব্যাহত রয়েছে।
Bseaborn

8
সতর্কতা, result of call to 'map' is unused একটি ত্রুটি নয়। Array.mapবেশিরভাগ ভাষায় পরিবর্তিত অ্যারে ফিরিয়ে দেবে। সমান পদ্ধতি যা কোনও অ্যারে ফেরত দেয় না, তা হবে view.subviews.forEach
রোলো

for view:CustomViewClass! in self.view.subviews where view.isKindOfClass(CustomViewClass) { view.doClassThing() }
আইটিএসাঙ্গার

আমি তর্ক করবে এই "পর্যন্ত সবচেয়ে ভালো উপায় দ্বারা সুইফট মধ্যে এই কাজ করতে" হয় দেখুন stackoverflow.com/a/24314054/1974224
Cristik

41

আইওএস / সুইফ্টের জন্য, আমি যে সমস্ত সাবভিউ ব্যবহার করি তা থেকে মুক্তি পেতে:

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

কোনও নির্দিষ্ট শ্রেণীর সমস্ত সংক্ষিপ্তসার থেকে মুক্তি পেতে (যেমন ইউআইএলবেল) আমি ব্যবহার করি:

for v in view.subviews{
   if v is UILabel{
      v.removeFromSuperview()
   }
}

31

কোড নিম্নলিখিত হিসাবে সহজ লেখা যেতে পারে।

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

18

এটি সহজ সমাধান হতে হবে।

let container_view: NSView = ...
container_view.subviews = []

( অন্যান্য পদ্ধতির জন্য দেখুন সমস্ত সাবউভিউ সরান? )


নোট করুন এটি একটি ম্যাকোস প্রশ্ন এবং এই উত্তরটি কেবল ম্যাকোসের জন্য কাজ করে । এটি আইওএসে কাজ করে না।


এটি অবশ্যই সহজতম উপায় ... অপসারণের অ্যারেতে আর নেই এমন প্রতিটি ভিউয়ের জন্য অপসারণ থেকে ফর্মসআপভিউ স্বয়ংক্রিয়ভাবে কল করা হবে।
ক্রিস্টোফার স্বাসে

2
@ দাতায়াহ এগুলি নয় তবে NSView(ওএস এক্স) এবং UIView(আইওএস) এর মধ্যে একটি বড় পার্থক্য রয়েছে ।
সুলতান

@ সুলতান আপনি ঠিক বলেছেন আমি এখানে ইউআইভিউয়ের স্যুইফ্ট উত্তরের জন্য এসেছি এবং আপনার পুরো কোড স্নিপেটটি
পড়িনি

1
সুইফট 4 ত্রুটি দেয়: সম্পত্তিকে বরাদ্দ করা যায় না: 'সাবউভিউস' হ'ল একমাত্র সম্পত্তি। :(
উইলিয়াম টি। ম্যালার্ড

1
@ আম্র্যাংগ্রি আবার, আমি আবারও বলছি, এটি সর্বদা ম্যাক ওএস প্রশ্ন, NSViewআইওএস এবং নয় UIView। কেবলমাত্র লোকেরা প্রশ্ন এবং ট্যাগগুলি পড়তে আগ্রহী না তাই এটি আইওএস উত্তরের সাথে পূর্ণ হয়ে উঠেছে।
সুলতান

10

আমি জানি না আপনি এটি সমাধান করতে পেরেছেন কিনা তবে আমি সম্প্রতি একটি অনুরূপ সমস্যাটি পেয়েছি যেখানে ফোর লুপটি প্রতিবার একটি দৃশ্য রেখে গেছে। আমি এটি খুঁজে পেয়েছি কারণ সেলফ্রোমসভিউভিউ () সরানোর সময় স্ব.সুবভিউগুলি পরিবর্তন করা হয়েছিল (সম্ভবত)।

এটি ঠিক করার জন্য আমি করেছি:

let subViews: Array = self.subviews.copy()
for (var subview: NSView!) in subViews
{
    subview.removeFromSuperview()
}

.কপি () করে, আমি স্ব.সুবভিউ অ্যারেগুলিকে পরিবর্তিত করার সময় প্রতিটি পর্যালোচনা অপসারণ করতে পারি। এর কারণ হ'ল অনুলিপি অ্যারে (সাবভিউ) এ অবজেক্টগুলির সমস্ত রেফারেন্স রয়েছে এবং তা রূপান্তরিত হয়নি।

সম্পাদনা: আপনার ক্ষেত্রে আমি মনে করি আপনি ব্যবহার করবেন:

let theSubviews: Array = container_view.subviews.copy()
for (var view: NSView!) in theSubviews
{
    view.removeFromSuperview()
}

ঠিক কাজ করে! ধন্যবাদ
আলবার্তো বেলিনী

হ্যালো, নিম্নলিখিতটি চেষ্টা করুন যদিও এটি করার জন্য আরও অনেক মার্জিত উপায় সম্ভবত রয়েছে: let subViewsArray: Array = (parentView.subviews as NSArray).copy() as Array<NSView>
অ্যাডাম রিচার্ডস

9

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

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

9

সমস্ত সাবভিউ মুছে ফেলার জন্য এক্সটেনশন, এটি দ্রুত সরানো হয়।

import Foundation
import UIKit

extension UIView {
    /// Remove allSubView in view
    func removeAllSubViews() {
        self.subviews.forEach({ $0.removeFromSuperview() })
    }

}

1
মানচিত্র কেন? ভবিষ্যদ্বাণী হতে পারে? subviews.forEach {rem 0.reoveFromSuperview ()}
ওলেকসান্দার

1
হ্যাঁ আপনি ঠিক বলেছেন আলেকসান্দ্র আমার মনে হয় আমি যখন এটি লিখছিলাম তখন আমার
কফিটি

6

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

var subViews = parentView.subviews as Array<UIView>

      for someView in subViews
      {
          someView.removeFromSuperview()
      }

আপডেট : আপনি যদি দুঃসাহসী বোধ করেন তবে আপনি ইউআইভিউতে নীচে প্রদর্শিত হিসাবে একটি এক্সটেনশন করতে পারেন:

extension UIView
{
    func removeAllSubViews()
    {
       for subView :AnyObject in self.subviews
       {
            subView.removeFromSuperview()
       }
    }

}

এবং এটিকে কল করুন:

parentView.removeAllSubViews()

2 ছোট জিনিস: আমি অসক্সে কাজ করছি, সুতরাং এটি <NS ভিউ> ঠিক হবে? তারপরে, আমি "মারাত্মক ত্রুটি: অ্যারে সূচি সীমার বাইরে" পেয়ে যাচ্ছি: /
আলবার্তো বেলিনি

হ্যাঁ, আমি ওএসএক্সে মনে করি এটি এনএসভিউ। মারাত্মক ত্রুটি কোথায় পাবেন?
আজমশর্প

আপনি কি নিশ্চিত যে আপনার পিতামাতার দর্শনটিতে সন্তানের উপাদান রয়েছে?
আজমশর্প

হ্যাঁ! আমি যদি একটি প্রিন্টন তৈরি করি (প্যারেন্টভিউ.সুবউভিউস) আমি 1 পেয়েছি
আলবার্তো বেলিনি

অদ্ভুত! সাধারণত সীমার বাইরে যাওয়ার অর্থ হল আপনি কোনও সূচকটি অ্যাক্সেস করছেন যা অস্তিত্বহীন এবং সাধারণত আমি বিশ্বাস করি এটি আই ++ এর মতো সূচীগুলির সাথে লুপের জন্য ব্যবহার করার কারণে ঘটেছে।
আজমশর্প

5

Xcodebeta6 এ এটি কার্যকর হয়েছে।

    var subViews = self.parentView.subviews
    for subview in subViews as [UIView]   {
        subview.removeFromSuperview()
    }

তা হ'ল আইওএস। আমার ওএস এক্স এর জন্য একটি সমাধান প্রয়োজন
আলবার্তো বেলিনি

আইওএস +1 এর জন্য দুর্দান্ত সমাধান
ইনভিউসনযোগ্য

3

আমি এই এক্সটেনশনটি লিখেছি:

extension UIView {
    func lf_removeAllSubviews() {
        for view in self.subviews {
            view.removeFromSuperview()
        }
    }
}

যাতে আপনি একটি ইউআইভিউকন্ট্রোলারে সেলফ.ভিউ.ল্ফ_রেমওএলসুবিউগুলি ব্যবহার করতে পারেন। আমি এটি আমার https://github.com/superarts/LFramework এর সুইফ্ট সংস্করণে পরে রাখব , যখন আমার সুইফ্টে আরও অভিজ্ঞতা হবে (এ পর্যন্ত 1 দিনের এক্সপ্রেস, এবং হ্যাঁ, এপিআইয়ের জন্য আমি আন্ডারস্কোর ছেড়ে দিয়েছি)।


3

সুইফট 3

আপনি যদি আপনার ভিউতে ট্যাগ যুক্ত করেন তবে আপনি একটি নির্দিষ্ট ভিউ সরাতে পারেন।

for v in (view?.subviews)!
{
    if v.tag == 321
    {
         v.removeFromSuperview()
    }
 }

কেন না view.subviews.filter({$0.tag != 321}).forEach({$0.removeFromSuperview()})?
আলেকজান্ডারজ

3

সুইফট 5

আমি মতামত সরানোর জন্য 2 টি ভিন্ন পদ্ধতি তৈরি করি। এবং যদি আমরা এগুলি রাখি তবে এটি ব্যবহার করা আরও সহজextension

extension UIView {
    /// Remove all subview
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }

    /// Remove all subview with specific type
    func removeAllSubviews<T: UIView>(type: T.Type) {
        subviews
            .filter { $0.isMember(of: type) }
            .forEach { $0.removeFromSuperview() }
    }
}

2

আপনার সিনট্যাক্সটি কিছুটা বন্ধ। আপনি স্পষ্টভাবে কাস্ট করেছেন তা নিশ্চিত করুন।

 let theSubviews : Array<NSView> = container_view.subviews as Array<NSView>
 for view in theSubviews {
     view.removeFromSuperview()
 }

@ ডেভিড হ্যাঁ এটি হবে, আমি এটিকে যথাসম্ভব ফক্সনোসের প্রাথমিক কোডের কাছে রাখার চেষ্টা করেছি।
জ্যাক

2

আপনি এটি চেষ্টা করতে হবে

func clearAllScrollSubView ()
{
    let theSubviews = itemsScrollView.subviews

    for (var view) in theSubviews
    {

        if view is UIView
        {
            view.removeFromSuperview()
        }

    }
}

এটি ইউআই এনএস নয়। এখানে আমরা ওএস এক্স সম্পর্কে কথা বলছি that এটি যদি ইউএস এর পরিবর্তে এনএস এর পরিবর্তে এটির সাথে কাজ করে তবে আমার খারাপ আপনি ঠিক বলেছেন :)
আলবার্তো বেলিনী

1

নির্দিষ্ট শ্রেণীর কেবলমাত্র সংক্ষিপ্তসারগুলি অপসারণ করার জন্য - এটি ছিল একমাত্র সুইফট কোড যা Xcode6.1.1 এ আমার জন্য কাজ করেছিল। ধরে নেওয়া যাক শুধুমাত্র subviews সরাতে চান ধরনের UIButton ...

for subView in nameofmysuperview.subviews {
    if subView.isKindOfClass(UIButton) {
        subView.removeFromSuperview()
    }
}

1

এক রৈখিক:

while(view.subviews.count > 0) {(view.subviews[0] as NSView).removeFromSuperview()}

আমি মনে করি এই পন্থাটি মানচিত্র বা ফর ইচ ব্যবহার করে "ওয়ান-লাইনার" এর চেয়ে বেশি পঠনযোগ্য । সংক্ষিপ্ত হাতের ভবিষ্যদ্বাণী এবং মানচিত্রটি বোঝা মুশকিল, কারণ যুক্তিটি আরও বিমূর্ত।


1

সুইফট 3 এর জন্য

আমি নিম্নলিখিত হিসাবে কাজ করেছি কারণ কেবল সুপারভিউ থেকে অপসারণ অ্যারে থেকে বোতামগুলি মুছে ফেলেনি।

    for k in 0..<buttons.count {

      buttons[k].removeFromSuperview()

    }


    buttons.removeAll()

1

এটি চেষ্টা করে দেখুন, আমি এটি পরীক্ষা করেছি:

  let theSubviews = container_view.subviews
  for subview in theSubviews {
      subview.removeFromSuperview()
  }

1

জন্য Swift 4.+

extension UIView {
     public func removeAllSubViews() {
          self.subviews.forEach({ $0.removeFromSuperview() })

}

আমি আশা করি এটি আপনার জন্য সম্পূর্ণ ব্যবহারযোগ্য।


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