विचारों को स्विच करने के लिए मैं UISegmentedControl का उपयोग कैसे करूं?


82

मैं यह जानने की कोशिश कर रहा हूं कि विचारों को स्विच करने के लिए UISegmentedControl के विभिन्न राज्यों का उपयोग कैसे किया जाए, 'टॉप पेड' और 'टॉप फ्री' के बीच स्वाइचिंग के दौरान ऐप्पल स्टोर में ऐप्पल इसे कैसे करता है।

जवाबों:


113

सबसे सरल दृष्टिकोण यह है कि दो दृश्य हैं जो इंगित करने के लिए आप उनकी दृश्यता को टॉगल कर सकते हैं कि किस दृश्य को चुना गया है। यहाँ कुछ नमूना कोड है कि यह कैसे किया जा सकता है, निश्चित रूप से विचारों को संभालने के लिए एक अनुकूलित तरीका नहीं है, लेकिन केवल यह प्रदर्शित करने के लिए कि आप दृश्य दृश्य को चालू करने के लिए UISegmentControl का उपयोग कैसे कर सकते हैं :

- (IBAction)segmentSwitch:(id)sender {
  UISegmentedControl *segmentedControl = (UISegmentedControl *) sender;
  NSInteger selectedSegment = segmentedControl.selectedSegmentIndex;

  if (selectedSegment == 0) {
    //toggle the correct view to be visible
    [firstView setHidden:NO];
    [secondView setHidden:YES];
  }
  else{
    //toggle the correct view to be visible
    [firstView setHidden:YES];
    [secondView setHidden:NO];
  }
}


आप निश्चित रूप से सही दृश्य को छिपाने / दिखाने के लिए कोड को फिर से फ़ैक्टर कर सकते हैं।


4
'निश्चित रूप से विचारों को संभालने का एक अनुकूलित तरीका नहीं है' - क्यों?
एडम वेट

3
@AdamWaite क्योंकि सभी विचारों को स्थायी रूप से स्मृति में संग्रहीत किया जाना है। यदि आपके विचार बहुत जटिल हैं और / या कई अन्य तत्व हैं तो यह समग्र प्रदर्शन को प्रभावित करेगा। कोड के उस टुकड़े को भी फिर से बनाया जा सकता है।
स्टस

@ आप सही हैं, कई व्यू कंट्रोलर्स के बीच तर्क को विभाजित करना बेहतर है, प्रत्येक अपने कार्यों और व्यवहारों के लिए जिम्मेदार है
tf.alves

कंटेनर दृश्यों का उपयोग करने से नेविगेशन बार के साथ समस्याएं हो सकती हैं। खासकर जब आप एक पारभासी का उपयोग कर रहे हैं। मेरे अनुभव से इसकी सिफारिश योग्य समाधान नहीं है
दमिरिज़

45

मेरे मामले में मेरे विचार काफी जटिल हैं और मैं सिर्फ अलग-अलग विचारों की छिपी हुई संपत्ति को नहीं बदल सकता क्योंकि यह बहुत अधिक स्मृति लेगा।

मैंने कई समाधानों की कोशिश की है और उनमें से गैर ने मेरे लिए काम किया है, या गलत तरीके से प्रदर्शन किया है, विशेष रूप से navBar के शीर्षक के साथ। हमेशा विचारों को धक्का / पॉपिंग करते समय सेगमेंटकंट्रोल नहीं दिखा रहा है।

मुझे यह ब्लॉग पोस्ट उस मुद्दे के बारे में मिला जो बताता है कि इसे उचित तरीके से कैसे किया जाए। लगता है कि उसे इस समाधान के साथ आने के लिए WWDC'2010 में Apple इंजीनियरों की सहायता मिली।

http://redartisan.com/2010/6/27/uisegmented-control-view-switching-revisited

इस लिंक में हल सबसे अच्छा समाधान है जो मैंने इस मुद्दे के बारे में पाया है। थोड़ा सा समायोजन के साथ इसने नीचे की तरफ टैबबार के साथ भी काम किया


शानदार खोज के लिए धन्यवाद। निश्चित रूप से इस पद्धति के लिए एक अच्छा और सुरुचिपूर्ण समाधान है।
श्युन

1
मैंने सफलता के बिना नीचे दिए गए टूलबार के साथ ठीक से काम करने की कोशिश की, stackoverflow.com/questions/4748120/… क्या आप कृपया मेरी मदद कर सकते हैं?
एरिक

क्या दृश्य के बीच में क्षैतिज फ्लिप एनीमेशन होने का कोई तरीका है। या यह केवल एनीमेशन के बिना काम करता है?
एक्यूराम

हाँ, यह एक महान समाधान प्रतीत होता है, लेकिन मैं इसे कैसे समायोजित कर सकता हूं काम करने के लिए tabBarController के साथ नेविगेशनकंट्रोलर पहले से ही अंदर है?
व्लादिमीर स्टाज़िलोव

2
सौभाग्य से, एक कंटेनर व्यू कंट्रोलर को कार्यान्वित करना त्रुटिपूर्ण रूप से काम करता है! यहां तक ​​कि उम्मीद के मुताबिक काम करते हैं।
1948 में ज्यूरीच

17

या यदि इसकी एक तालिका है, तो आप तालिका को फिर से लोड कर सकते हैं और cellForRowAtIndex में, खंड के विकल्प के आधार पर विभिन्न डेटा स्रोतों से तालिका को पॉप्युलेट कर सकते हैं।


7

एक विचार यह है कि खंडों के नियंत्रण के साथ एक दृश्य होता है जिसमें एक कंटेनर दृश्य होता है जिसे आप अलग-अलग साक्षात्कारों के साथ भरते हैं (जब खंड टॉगल होते हैं तो कंटेनर दृश्य का एकमात्र उपखंड के रूप में जोड़ते हैं)। यहां तक ​​कि उन साक्षात्कारों के लिए आपके पास अलग-अलग व्यू कंट्रोलर भी हो सकते हैं, हालांकि आपको जरूरत पड़ने पर "viewWillAppear" और "viewWillDisappear" जैसे महत्वपूर्ण तरीकों पर आगे बढ़ना होगा (और उन्हें बताना होगा कि वे किस नेविगेशन कंट्रोलर के तहत हैं)।

आम तौर पर यह बहुत अच्छी तरह से काम करता है क्योंकि आप आईबी में कंटेनर के साथ मुख्य दृश्य को बाहर कर सकते हैं, और साक्षात्कार में जो कुछ भी कंटेनर उन्हें भरने देता है उसे भरना होगा (यह सुनिश्चित करें कि आपके ऑटोरेसेज़ मास्क ठीक से सेट किए गए हैं)।


3

SNFSegmentedViewControllerएक ओपन-सोर्स घटक का उपयोग करने का प्रयास करें , जो बिल्कुल वैसा ही है जैसा आप सेटअप के साथ देख रहे हैं UITabBarController


2

@ रॉनी Liew के उत्तर से, मैं इसे बनाता हूं:

//
//  ViewController.m
//  ResearchSegmentedView
//
//  Created by Ta Quoc Viet on 5/1/14.
//  Copyright (c) 2014 Ta Quoc Viet. All rights reserved.
//
#define SIZE_OF_SEGMENT 56
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize theSegmentControl;
UIView *firstView;
UIView *secondView;
CGRect leftRect;
CGRect centerRect;
CGRect rightRect;
- (void)viewDidLoad
{
    [super viewDidLoad];
    leftRect = CGRectMake(-self.view.frame.size.width, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT);
    centerRect = CGRectMake(0, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT);
    rightRect = CGRectMake(self.view.frame.size.width, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT);

    firstView = [[UIView alloc] initWithFrame:centerRect];
    [firstView setBackgroundColor:[UIColor orangeColor]];
    secondView = [[UIView alloc] initWithFrame:rightRect];
    [secondView setBackgroundColor:[UIColor greenColor]];
    [self.view addSubview:firstView];
    [self.view addSubview:secondView];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)segmentSwitch:(UISegmentedControl*)sender {
    NSInteger selectedSegment = sender.selectedSegmentIndex;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.2];
    if (selectedSegment == 0) {
        //toggle the correct view to be visible
        firstView.frame = centerRect;
        secondView.frame = rightRect;
    }
    else{
        //toggle the correct view to be visible
        firstView.frame = leftRect;
        secondView.frame = centerRect;
    }
    [UIView commitAnimations];
}
@end

2

में। असाइन करें

 UISegmentedControl *lblSegChange;

- (IBAction)segValChange:(UISegmentedControl *) sender

घोषणा करें। एम

- (IBAction)segValChange:(UISegmentedControl *) sender
{

 if(sender.selectedSegmentIndex==0)
 {
  viewcontroller1 *View=[[viewcontroller alloc]init];
  [self.navigationController pushViewController:view animated:YES];
 }
 else 
 {
  viewcontroller2 *View2=[[viewcontroller2 alloc]init];
  [self.navigationController pushViewController:view2 animated:YES];
 }
} 

2

स्विफ्ट संस्करण:

प्रत्येक बच्चे के दृश्य नियंत्रक के आकार और स्थिति को निर्धारित करने के लिए मूल दृश्य नियंत्रक जिम्मेदार है। चाइल्ड व्यू कंट्रोलर का दृश्य पेरेंट व्यू कंट्रोलर के व्यू पदानुक्रम का हिस्सा बन जाता है।

आलसी गुणों को परिभाषित करें:

private lazy var summaryViewController: SummaryViewController = {
   // Load Storyboard
   let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

   // Instantiate View Controller
   var viewController = storyboard.instantiateViewController(withIdentifier: "SummaryViewController") as! SummaryViewController

   // Add View Controller as Child View Controller
   self.add(asChildViewController: viewController)

   return viewController
}()

private lazy var sessionsViewController: SessionsViewController = {
    // Load Storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

    // Instantiate View Controller
    var viewController = storyboard.instantiateViewController(withIdentifier: "SessionsViewController") as! SessionsViewController

    // Add View Controller as Child View Controller
    self.add(asChildViewController: viewController)

    return viewController
}()

चाइल्ड व्यू कंट्रोलर्स को दिखाएँ / छिपाएँ:

private func add(asChildViewController viewController: UIViewController) {
    // Add Child View Controller
    addChildViewController(viewController)

    // Add Child View as Subview
    view.addSubview(viewController.view)

    // Configure Child View
    viewController.view.frame = view.bounds
    viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    // Notify Child View Controller
    viewController.didMove(toParentViewController: self)
}

private func remove(asChildViewController viewController: UIViewController) {
    // Notify Child View Controller
    viewController.willMove(toParentViewController: nil)

    // Remove Child View From Superview
    viewController.view.removeFromSuperview()

    // Notify Child View Controller
    viewController.removeFromParentViewController()
}

सेगमेंटेड कंट्रोल टेप को प्रबंधित करें

private func updateView() {
    if segmentedControl.selectedSegmentIndex == 0 {
        remove(asChildViewController: sessionsViewController)
        add(asChildViewController: summaryViewController)
    } else {
        remove(asChildViewController: summaryViewController)
        add(asChildViewController: sessionsViewController)
    }
}

और निश्चित रूप से आप अपने बच्चे को देखने वाले कक्षाओं में उपयोग करने में सक्षम हैं:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print("Summary View Controller Will Appear")
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    print("Summary View Controller Will Disappear")
}

संदर्भ: https://cocoacasts.com/managing-view-controllers-with-container-view-controllers/


1
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं। - समीक्षा से
बेसिल पेरेनॉड

2
@BasilePerrenoud बस समाधान के महत्वपूर्ण और सबसे महत्वपूर्ण भाग के साथ उत्तर को अद्यतन किया।
स्लाविसापेटकोविक

1

एक त्वरित स्विफ्ट संस्करण:

@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) {

    if segmentControl.selectedSegmentIndex == 0 {

        // do something
    } else {

        // do something else
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.