objective c - कैसे scrollview से subviews को दूर करने के लिए?




objective-c iphone (6)

मैं अपने स्क्रॉल वीव्यू से सभी सबव्यूज़ कैसे निकालूं?

मेरे पास एक यूवीव्यू और इसके ऊपर एक बटन स्क्रॉलव्यू में ऐसा कुछ है ....

स्क्रॉल व्यू में सबव्यूज़ जोड़ने के लिए यहां मेरा कोड है I

-(void)AddOneButton:(NSInteger)myButtonTag {
lastButtonNumber = lastButtonNumber + 1;

if ((lastButtonNumber == 1) || ((lastButtonNumber%2) == 1)) {
btnLeft = 8;}
else if ((lastButtonNumber == 2) || ((lastButtonNumber%2) == 0)) {
btnLeft = 162;
}
CGRect frame1 = CGRectMake(btnLeft, btnTop, 150, 150);
CGRect frame2 = CGRectMake(btnLeft, btnTop, 150, 150);
UIButton *Button = [UIButton buttonWithType:UIButtonTypeCustom];
Button.frame = frame1;
Button.tag = myButtonTag;
[Button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
[Button setBackgroundColor:[UIColor clearColor]];
[Button setBackgroundImage:[UIImage imageNamed:@"WaitScreen.png"] forState:UIControlStateHighlighted];

    GraphThumbViewControllerobj = [[GraphThumbViewController alloc] initWithPageNumber:[[GraphIdArray objectAtIndex:myButtonTag]intValue]];
    GraphThumbViewControllerobj.view.frame=frame2;
    GraphThumbViewControllerobj.lblCounter.text=[NSString stringWithFormat:@"%d of %d",myButtonTag+1,flashCardsId.count];
    GraphThumbViewControllerobj.lblQuestion.text=[flashCardText objectAtIndex:myButtonTag];
    [myScrollView addSubview:GraphThumbViewControllerobj.view];


[myScrollView addSubview:Button];


if ((lastButtonNumber == 2) || ((lastButtonNumber%2) == 0)) {
btnTop = btnTop + 162;
}
if (btnTop+150 > myScrollView.frame.size.height) {
myScrollView.contentSize = CGSizeMake((myScrollView.frame.size.width), (btnTop+160));}
}

और यहां सबव्यूज़ को हटाने के लिए कोड है

if(myScrollView!=nil)
{
        while ([myScrollView.subviews count] > 0) {
            //NSLog(@"subviews Count=%d",[[myScrollView subviews]count]);
            [[[myScrollView subviews] objectAtIndex:0] removeFromSuperview];
}

वैकल्पिक पाठ http://www.freeimagehosting.net/uploads/e5339a1f51.png


UIScrollView और UIView के अन्य उप वर्ग के साथ समस्या यह है कि वे शुरू में कुछ दृश्य (जैसे UIScrollView के लिए ऊर्ध्वाधर और क्षैतिज स्क्रॉलबार) शामिल हैं इसलिए मैंने कक्षा में फ़िल्टर किए गए सबव्यूज़ को हटाने के लिए UIView की एक श्रेणी बनाई।

उदाहरण के लिए:

[UIScrollView removeAllSubviewsOfClass:[FooView class],[BarView class],nil];

कोड:

- (void)removeAllSubviewsOfClass:(Class)firstClass, ... NS_REQUIRES_NIL_TERMINATION;


- (void)removeAllSubviewsOfClass:(Class)firstClass, ...
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"FALSEPREDICATE"];

    va_list args;
    va_start(args, firstClass);

    for (Class class = firstClass; class != nil; class = va_arg(args, Class)) 
    {
        predicate = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:predicate,[NSPredicate predicateWithFormat:@"self isKindOfClass:%@",class], nil]];
    }

    va_end(args);
    [[self.subviews filteredArrayUsingPredicate:predicate] makeObjectsPerformSelector:@selector(removeFromSuperview)];

}

एक पुराना सवाल; लेकिन चूंकि इसके लिए Google पर पहला हिट है मैंने सोचा कि मैं यह भी नोट बनाऊँगा कि इस पद्धति भी है:

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

आप यह नहीं कर सकते KindOfClass इस के साथ जांच, लेकिन यह अभी भी एक अच्छा समाधान के बारे में पता है

संपादित करें: नोट करने के लिए एक और मुद्दा यह है कि स्क्रॉलबार की स्क्रॉलबार को उस स्क्रॉल वीव के उपव्यू के रूप में जोड़ा गया है। इस प्रकार अगर आप एक स्क्रॉल वीव्यू के सभी सबव्यूज़ के जरिए पुनरावृत्त हो जाते हैं तो आप इसे भर में आएंगे। यदि इसे निकाल दिया जाता है तो वह स्वयं को फिर से जोड़ देगा - लेकिन यह जानना ज़रूरी है कि अगर आप केवल अपने स्वयं के UIView उपवर्गों को वहां रहने की उम्मीद कर रहे हैं

स्विफ्ट 3 के लिए संशोधन:

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

टिम ने जो कहा, उसमें जोड़ने के लिए, मैंने देखा कि आप अपने विचारों को टैग कर रहे हैं। यदि आप एक विशिष्ट टैग के साथ एक दृश्य को निकालना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

[[myScrollView viewWithTag:myButtonTag] removeFromSuperview];

मुझे नहीं लगता कि आपको तेज गणना सुझाव का उपयोग करना चाहिए।

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

क्या यह कोई अपवाद फेंकना नहीं है, यदि आप संग्रह को पुनरावृत्त किया जा रहा है? http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocFastEnumeration.html#//apple_ref/doc/uid/TP30001163-CH18-SW3

यह उदाहरण बेहतर हो सकता है

NSArray *subviews = [[scroller subviews] copy];
for (UIView *subview in subviews) {
    [subview removeFromSuperview];
}
[subviews release];

सबसे आसान और सबसे अच्छा तरीका है

 for(UIView *subview in [scrollView subviews]) {

     [subview removeFromSuperview];

 }

for(subview) in self.scrollView.subviews {
        subview.removeFromSuperview()
}




uiscrollview