2012-07-10 9 views
11

यह समस्या मुझे पागल कर रही है। मैं viewController को बदलने की कोशिश कर रहा हूं जब उपयोगकर्ता खंडित नियंत्रण के चयनित "टैब" को बदलता है। मैंने कुछ घंटों का शोध किया है और स्टोरीबोर्ड के माध्यम से काम करने या काम करने में कोई जवाब नहीं मिला है।जब सेगमेंट नियंत्रण में परिवर्तन होता है तो दृश्य नियंत्रक बदल रहा है

यह वास्तव में मुझे परेशान करता है क्योंकि एक टैब एप्लिकेशन सेट करना इतना आसान है, लेकिन टैब एप्लिकेशन की तरह सेगमेंट किए गए नियंत्रण का उपयोग करने की कोशिश करना अभी काम नहीं कर रहा है। मुझे पहले से ही पता है कि सेगमेंट नियंत्रण में कौन सी अनुक्रमणिका का चयन किया गया है। इसे कैसे प्राप्त किया जा सकता है?

बहुत बहुत धन्यवाद।

+0

क्या आप _view_ या _view नियंत्रक_ को स्वैप करने का प्रयास कर रहे हैं? वे दो अलग-अलग चीजें हैं। यदि उत्तरार्द्ध, मैं सुझाव देता हूं कि सब कुछ एक दृश्य नियंत्रक में घुमाए और उप-दृश्यों को दिखाएं या छुपाएं क्योंकि उनकी आवश्यकता है। –

+0

वैसे मैं आईओएस में वास्तव में नया हूं, मेरे दिमाग में आने वाली सबसे सरल चीज व्यू कंट्रोलर को टैब्ड एप्लिकेशन की तरह बदल देती है। क्या आप एक ही दृश्य नियंत्रक के साथ विभिन्न विचार बनाने और उन्हें प्रबंधित करने का सुझाव देते हैं? यदि हां, तो मैं यह कैसे कर सकता हूं? बहुत बहुत धन्यवाद –

उत्तर

4

मैं कहूंगा कि यह बहुत सिम है UIViewController के भीतर सबव्यूव्स बदलने के लिए प्लियर, आप अपने स्टोरीबोर्ड में अपने सबव्यूव्स सेट अप कर सकते हैं और अपने कंट्रोलर में IBOulets के साथ उन्हें हुक कर सकते हैं, आप क्लिक किए गए नियंत्रण के आधार पर hidden अपने विचारों की संपत्ति YES या NO पर सेट कर सकते हैं।

अब, यदि आप @ रोबोटिक बिल्ली के दृष्टिकोण का उपयोग करते हैं जो एक अच्छा समाधान भी है, तो आप अपने ऐप के काम में थोड़ा अधिक मॉड्यूलरिटी कर सकते हैं, क्योंकि आपको प्रस्तुत किए गए समाधान का उपयोग करके अपने सभी तर्क को एक नियंत्रक में रखना होगा ।

+0

मुझे आपको पसंद है सुझाव है कि आपने इसे एक्सकोड पर आज़माएं और इसे लागू करने के लिए अच्छा और आसान लग रहा है। मेरी एकमात्र चिंता पृष्ठभूमि में छिपे हुए विचारों के लिए अक्षम है? –

+1

मैंने टी डेवलपर दस्तावेज़ों में कुछ भी नहीं पढ़ा है जो इसके खिलाफ जाता है, हालांकि आपको यह विचार करना होगा कि यदि आप बहुत सारे दृश्य तत्व जोड़ते हैं तो यह स्मृति लेगा, इसलिए समझदारी से करें। इससे बचने के लिए आप फ्लाई पर जो भी चीज चाहते हैं उसे प्रेरित कर सकते हैं, हालांकि मुझे विश्वास है कि पहले से स्थापित सभी तत्वों का ओवरहेड न्यूनतम है। उदाहरण के लिए मेरे पास केवल 1 या 2 टेक्स्टफील्ड वाले 4 सबव्यूव हैं। – 8vius

+1

मेरे आईपैड ऐप्स में से एक में, मेरे पास एक व्यू कंट्रोलर है जिसमें 7 सबव्यूव है जो दिखाया जा सकता है या छुपाया जा सकता है, प्रत्येक के अपने नियंत्रण के सेट के साथ। कुल मिलाकर, लगभग 60 विचार और सबवीज (लेबल, बटन इत्यादि) हैं। मुझे कोई धीमा या हिचकिचाहट नहीं दिखता है, और प्रोफेसर मेमोरी या सीपीयू में किसी भी विशाल स्पाइक को प्रकट नहीं करता है। जाहिर है, आपको अपने स्वयं के समाधान का पूरी तरह से परीक्षण करना चाहिए, लेकिन मुझे संदेह है कि आपको कोई समस्या होगी। –

0

UISegmentedControl एक अलग अलग है जिसमें इसका प्रतिनिधि प्रोटोकॉल नहीं है, आपको "लक्ष्य जोड़ें" शैली का उपयोग करना होगा। आपके मामले में आप क्या करना चाहते हैं, जब UISegmentedControl बदलता है (जो कि मूल दृश्य नियंत्रक की संभावना है) को अधिसूचित करने के लिए एक लक्ष्य जोड़ें, और तब वह लक्ष्य टैब स्विचिंग से निपट सकता है।

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

[self.mainSegmentedControl addTarget:self action:@selector(changedSegmentedControl:) forControlEvents:UIControlEventValueChanged]; 

इस उदाहरण में, कोड हिस्सों में बंटा हुआ नियंत्रण के लिए चर की पहुंच है कि कुछ देखें/नियंत्रक से लागू की जा रही है। हम चेंज सेगमेंटेड कंट्रोल पाने के लिए खुद को जोड़ते हैं: विधि लागू की गई।

तो फिर तुम तो जैसे एक और तरीका होगा:

- (void)changedSegmentedControl:(id)sender 
{ 
    UISegmentedControl *ctl = sender; 
    NSLog(@"Changed value of segmented control to %d", ctl.selectedSegmentIndex); 
    // Code to change View Controller goes here 
} 

नोट: इस अपरीक्षित स्मृति से लिखे कोड है - तदनुसार डॉक्स से परामर्श लें।

42

नोट: उत्तर @interface अनुभाग

सहित iOS के लिए दृश्य नियंत्रक रोकथाम कोड 5 + के साथ अद्यतन मेरा कोई एप्लिकेशन में, मैं नेविगेशन बार में कोई सेगमेंट नियंत्रण और पर क्लिक करने के साथ एक दृश्य नियंत्रक है "टैब" दृश्य नियंत्रकों स्विच करता है। बुनियादी विचार है कि सेगमेंट इंडेक्स का एक सरणी है और सेगमेंट इंडेक्स (और इंडेक्सडिड चेंज फॉर सेगमेंटेड कंट्रोल आईबीएक्शन।

मेरे ऐप से उदाहरण कोड (आईओएस 5 या बाद में) (यह 2 व्यू कंट्रोलर के लिए है, लेकिन यह मामूली रूप से है) । कई दृश्य नियंत्रकों के लिए बढ़ा दिया) कोड थोड़ा आईओएस 4 के लिए अधिक लंबी है लेकिन वस्तु ग्राफ बरकरार रखेंगे इसके अलावा, यह एआरसी का उपयोग करता है:

@interface MyViewController() 
// Segmented control to switch view controllers 
@property (weak, nonatomic) IBOutlet UISegmentedControl *switchViewControllers; 

// Array of view controllers to switch between 
@property (nonatomic, copy) NSArray *allViewControllers; 

// Currently selected view controller 
@property (nonatomic, strong) UIViewController *currentViewController; 
@end 

@implementation UpdateScoreViewController 
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Create the score view controller 
    ViewControllerA *vcA = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerA"]; 

    // Create the penalty view controller 
    ViewControllerB *vcB = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerB"]; 

    // Add A and B view controllers to the array 
    self.allViewControllers = [[NSArray alloc] initWithObjects:vcA, vcB, nil]; 

    // Ensure a view controller is loaded 
    self.switchViewControllers.selectedSegmentIndex = 0; 
    [self cycleFromViewController:self.currentViewController toViewController:[self.allViewControllers objectAtIndex:self.switchViewControllers.selectedSegmentIndex]]; 
} 

#pragma mark - View controller switching and saving 

- (void)cycleFromViewController:(UIViewController*)oldVC toViewController:(UIViewController*)newVC { 

    // Do nothing if we are attempting to swap to the same view controller 
    if (newVC == oldVC) return; 

    // Check the newVC is non-nil otherwise expect a crash: NSInvalidArgumentException 
    if (newVC) { 

     // Set the new view controller frame (in this case to be the size of the available screen bounds) 
     // Calulate any other frame animations here (e.g. for the oldVC) 
     newVC.view.frame = CGRectMake(CGRectGetMinX(self.view.bounds), CGRectGetMinY(self.view.bounds), CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds)); 

     // Check the oldVC is non-nil otherwise expect a crash: NSInvalidArgumentException 
     if (oldVC) { 

      // Start both the view controller transitions 
      [oldVC willMoveToParentViewController:nil]; 
      [self addChildViewController:newVC]; 

      // Swap the view controllers 
      // No frame animations in this code but these would go in the animations block 
      [self transitionFromViewController:oldVC 
           toViewController:newVC 
             duration:0.25 
             options:UIViewAnimationOptionLayoutSubviews 
            animations:^{} 
            completion:^(BOOL finished) { 
             // Finish both the view controller transitions 
             [oldVC removeFromParentViewController]; 
             [newVC didMoveToParentViewController:self]; 
             // Store a reference to the current controller 
             self.currentViewController = newVC; 
            }]; 

     } else { 

      // Otherwise we are adding a view controller for the first time 
      // Start the view controller transition 
      [self addChildViewController:newVC]; 

      // Add the new view controller view to the ciew hierarchy 
      [self.view addSubview:newVC.view]; 

      // End the view controller transition 
      [newVC didMoveToParentViewController:self]; 

      // Store a reference to the current controller 
      self.currentViewController = newVC; 
     } 
    } 
} 

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

    NSUInteger index = sender.selectedSegmentIndex; 

    if (UISegmentedControlNoSegment != index) { 
     UIViewController *incomingViewController = [self.allViewControllers objectAtIndex:index]; 
     [self cycleFromViewController:self.currentViewController toViewController:incomingViewController]; 
    } 

} 
@end 

मूल उदाहरण (आईओएस 4 या पहले):

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Create the score view controller 
    AddHandScoreViewController *score = [self.storyboard instantiateViewControllerWithIdentifier:@"AddHandScore"]; 

    // Create the penalty view controller 
    AddHandPenaltyViewController *penalty = [self.storyboard instantiateViewControllerWithIdentifier:@"AddHandPenalty"]; 

    // Add Score and Penalty view controllers to the array 
    self.allViewControllers = [[NSArray alloc] initWithObjects:score, penalty, nil]; 

    // Ensure the Score controller is loaded 
    self.switchViewControllers.selectedSegmentIndex = 0; 
    [self switchToController:[self.allViewControllers objectAtIndex:self.switchViewControllers.selectedSegmentIndex]]; 
} 

#pragma mark - View controller switching and saving 

- (void)switchToController:(UIViewController *)newVC 
{ 
    if (newVC) { 
     // Do nothing if we are in the same controller 
     if (newVC == self.currentViewController) return; 

     // Remove the current controller if we are loaded and shown 
     if([self.currentViewController isViewLoaded]) [self.currentViewController.view removeFromSuperview]; 

     // Resize the new view controller 
     newVC.view.frame = CGRectMake(CGRectGetMinX(self.view.bounds), CGRectGetMinY(self.view.bounds), CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds)); 

     // Add the new controller 
     [self.view addSubview:newVC.view]; 

     // Store a reference to the current controller 
     self.currentViewController = newVC; 
    } 
} 

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

    NSUInteger index = sender.selectedSegmentIndex; 

    if (UISegmentedControlNoSegment != index) { 
     UIViewController *incomingViewController = [self.allViewControllers objectAtIndex:index]; 
     [self switchToController:incomingViewController]; 
    } 

} 
+0

वास्तव में अच्छा समाधान। इसे साझा करने के लिए धन्यवाद। – Mike

+0

@ रोबोटिक बिल्ली: मैं थोड़ी उलझन में हूं कि आप बच्चे दृश्य नियंत्रक के फ्रेम को पैरेंट व्यू कंट्रोलर के समान क्यों सेट करते हैं। क्या यह अभिभावक दृश्य नियंत्रक UISegmentedControl नहीं है? यदि हां, तो क्या बच्चे को देखने वाला नियंत्रक अस्पष्ट नहीं होगा? – Marplesoft

+0

@Marplesoft: आमतौर पर 'UISegmentedControl' नेविगेशन बार में है। जाहिर है, यदि आपका 'UISegmentedControl' आपके व्यू कंट्रोलर में है तो आपको अपने ऐप के लिए अपने ऑटोलायआउट बाधाओं या फ्रेम को सही मानों पर सेट करना चाहिए। –

0

इस पॉड पर एक नज़र डालें: https://github.com/xmartlabs/XLMailBoxContainer। यह दृश्य नियंत्रकों के बीच यूआई एनीमेशन बनाता है। ये व्यू कंट्रोलर UITableViewController या किसी अन्य व्यू कंट्रोलर का विस्तार कर सकता है।

मुझे उम्मीद है कि यह आपकी मदद करेगा!

संबंधित मुद्दे

 संबंधित मुद्दे