iPhone: नेविगेशन बार के साथ मोडल UITableViewController दिखाएं


87

मैं एक मोडल दृश्य दिखा रहा हूं जो एक UITableViewControllerवर्ग है। किसी कारण से यह नेविगेशन बार नहीं दिखाएगा जब मैं इसे दिखाऊंगा। यहाँ मेरा कोड है:

SettingsCreateAccount *detailViewController = [[SettingsCreateAccount alloc] initWithStyle:UITableViewStyleGrouped];
    detailViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    detailViewController.navigationController.navigationBarHidden = NO;
    [self.navigationController presentModalViewController:detailViewController animated:YES];
    detailViewController = nil;
    [detailViewController release];

मुझे लगा कि यह डिफ़ॉल्ट रूप से दिखाया गया है? यदि यह मदद करता है, तो मैं इसे एक अन्य वर्ग से बुला रहा हूं जो कि एक UITableViewControllerद्वारा प्रबंधित भी है UINavigationController। विचार?

जवाबों:


146

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

यदि आप नेविगेशन कार्यक्षमता के साथ एक मोडल व्यू कंट्रोलर प्रस्तुत करना चाहते हैं, तो आपको एक मॉडेल नेविगेशन कंट्रोलर प्रस्तुत करने की आवश्यकता है, जिसमें आपका विवरण व्यू कंट्रोलर हो, जैसे:

SettingsCreateAccount *detailViewController = [[SettingsCreateAccount alloc] initWithStyle:UITableViewStyleGrouped];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:detailViewController];
[detailViewController release];

navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:navController animated:YES];
[navController release];

आपका मॉडल नियंत्रक अपने स्वयं के नेविगेशन स्टैक का प्रबंधन करेगा।


धन्यवाद, मैं स्पष्टीकरण की सराहना करता हूं इसलिए मुझे पता है कि मैंने क्या गलत किया था।
निक हब्बार्ड

1
यदि आप एक स्टोरीबोर्ड का उपयोग करते हैं, तो इसे पूरा करने के लिए कोई कोडिंग शामिल नहीं है। अच्छा समाधान!
जेल

36

यहां उन लोगों के लिए नेविगेशन बार प्रदर्शित करने का एक तरीका है जो स्टोरीबोर्ड पर Apple के ट्यूटोरियल द्वारा सुझाए गए स्टोरीबोर्ड का उपयोग कर रहे हैं ।

क्योंकि मोडल व्यू कंट्रोलर को नेविगेशन स्टैक में जोड़ा नहीं जाता है, इसे टेबल व्यू कंट्रोलर के नेविगेशन कंट्रोलर से नेविगेशन बार नहीं मिलता है। सामान्य रूप से प्रस्तुत किए जाने पर व्यू कंट्रोलर को नेविगेशन बार देने के लिए, इसे अपने नेविगेशन कंट्रोलर में एम्बेड करें।

  1. बाह्यरेखा दृश्य में, नियंत्रक देखें का चयन करें।
  2. चयनित व्यू कंट्रोलर के साथ, संपादक> एंबेड इन> नेविगेशन कंट्रोलर चुनें।

सुनिश्चित करें कि आप नेविगेशन नियंत्रक में मोडल
सेगमेंट जोड़ते हैं

ट्विटर की एडिट यूजर प्रोफाइल पेज की स्थिति में। यह एक मामूली रूप से प्रस्तुत UITableViewController है और इसमें सबसे ऊपर DONE और CANCEL बटन हैं। यह उत्तर उस स्थिति में कोई अर्थ नहीं देता है क्योंकि नेविगेशन नहीं हो रहा है।
विलियम एंट्रीकेन

17

IOS 7 पर और आप केवल शीर्षक और कुछ बटन दिखाने के लिए अपने मोडल व्यू कंट्रोलर पर एक नेविगेशन बार चाहते हैं? इस जादू को अपने UITableViewController में आज़माएं:

// in the .h
@property (strong) UINavigationBar* navigationBar;

//in the .m
- (void)viewDidLoad {
    [super viewDidLoad];

    self.navigationItem.title = @"Awesome";
    self.navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectZero];
    [self.view addSubview:_navigationBar];
    [self.navigationBar pushNavigationItem:self.navigationItem animated:NO];
}

-(void)layoutNavigationBar{
    self.navigationBar.frame = CGRectMake(0, self.tableView.contentOffset.y, self.tableView.frame.size.width, self.topLayoutGuide.length + 44);
    self.tableView.contentInset = UIEdgeInsetsMake(self.navigationBar.frame.size.height, 0, 0, 0);
}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    //no need to call super
    [self layoutNavigationBar];
}

-(void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];
    [self layoutNavigationBar];
}

चीजों को करने का एक शानदार तरीका है। लेकिन जब मैं इसे स्टेटिक यूआईटेबल व्यू कॉन्ट्रोलर पर ट्राइ कर रहा हूं, तो मैं अब टेबलव्यू को स्क्रॉल नहीं कर पा रहा हूं। किसी भी विचार क्यों?
थॉमस बेस्नेहर्ड

2
आजकल आप इसे नेविगेशन नियंत्रक में बेहतर रूप से एम्बेड कर रहे होंगे।
मलय

यह एक अच्छा समाधान है लेकिन एक छोटी सी बात यह है कि जब आप नेविगेशन शीर्षक पट्टी के शीर्ष पर सेल हेडर शीर्षक दिखाते हैं।
अली

[self.view bringSubviewToFront:self.navigationBar];के अंत में जोड़कर मैंने इसे हल किया -(void)layoutNavigationBar
अली

7

मैं साझा करना चाहता हूं कि स्टोरीबोर्ड के साथ परियोजनाओं में स्वीकृत समाधान का उपयोग कैसे किया जा सकता है:

सरल दृष्टिकोण कुलपति के सामने एक स्टोरीबोर्ड रिक्त नेविगेशन नियंत्रक में रखा जाना है, जिसे औपचारिक रूप से प्रस्तुत किया जाना है, इसलिए संबंध इस तरह दिखते हैं:

(प्रस्तुतकर्ता कुलपति) -> सामान्य रूप से प्रस्तुत करता है -> (नेविगेशन नियंत्रक एक नियंत्रक होने के रूप में प्रस्तुत किया जा सकता है)।

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

हमारा वर्तमान समाधान कोड को कस्टम सेगमेंट के स्वीकृत उत्तर से अलग करना है:

#import "ModalPresentationWithNavigationBarSegue.h"

@implementation ModalPresentationWithNavigationBarSegue

- (void)perform {
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:self.destinationViewController];

    [self.sourceViewController presentViewController:navigationController animated:YES completion:nil];
}
@end

हमारी परियोजना में इस तर्क के बाद हम अपने स्टोरीबोर्ड में इंटरमीडिएट नेविगेशन नियंत्रक नहीं बनाते हैं, हम बस इस ModalPresentationWithNavigationBarSegue का उपयोग करते हैं:

प्रस्तुतकर्ता VC -> प्रेजेंटी VC

मुझे उम्मीद है कि यह उत्तर उन लोगों के लिए उपयोगी होगा जो अपने ऐप स्टोरीबोर्ड में अनावश्यक दोहराव से बचना पसंद करते हैं।


5

यदि आपको केवल एक की आवश्यकता है NavigationBar, तो आप इसका एक उदाहरण जोड़ सकते हैं UINavigationBarऔर BarItems को असाइन कर सकते हैं ।


यह ViewController पर निर्भर करता है: मुझे लगता है कि आप UITableViewController के लिए एक UINavigationBar जोड़ नहीं सकते, क्या आप कर सकते हैं?
टोबियास

आईबी में, संपादक पर जाएँ -> नेविगेशन नियंत्रक में एम्बेड करें, और आपके पास एक नेविगेशन बार होगा। खींचें और उसमें BarButtonItems जोड़ें।
अमिताभ

5

मैं सिर्फ @Scott ने जो कुछ कहा था, उसमें कुछ जोड़ना चाहता था। उसका जवाब निश्चित रूप से स्टोरीबोर्ड, आईओएस 7 और 8 ... (और जल्द ही, 9) के साथ करने का सबसे आसान और सबसे स्वीकृत तरीका है।

निश्चित रूप से स्टोरीबोर्ड में एक दृश्य नियंत्रक जोड़ना और इसे @Scott द्वारा वर्णित एंबेड करना एक सही तरीका है।

फिर, स्रोत दृश्य नियंत्रक से लक्ष्य तक कंट्रोल-ड्रैगिंग द्वारा सीग्यू को जोड़ें (जिसे आप मामूली दिखाना चाहते हैं), "प्रेजेंट मोडली" का चयन करें जब थोड़ा दृश्य सेग के प्रकार के लिए विकल्पों के साथ दिखाई दे। संभवतः इसे एक नाम देने के लिए अच्छा है (नीचे दिए गए उदाहरण में मैं "presentMyModalViewController" का उपयोग करता हूं)।

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

यदि आप segue.destinationViewController को पकड़ लेते हैं, तो यह एक UINavigationController होगा, न कि नियंत्रक जो आप UINavigationController में एम्बेडेड है।

इसलिए, नेविगेशन कंट्रोलर के अंदर एम्बेडेड व्यू कंट्रोलर प्राप्त करने के लिए, यहाँ मैंने क्या किया:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"presentMyModalViewController"]) {
        // This could be collapsed, but it's a little easier to see
        // what's going on written out this way.

        // First get the destination view controller, which will be a UINavigationController
        UINavigationController *nvc = (UINavigationController *)segue.destinationViewController;

        // To get the view controller we're interested in, grab the navigation controller's "topViewController" property
        MyModalViewController *vc = (EmailReceiptViewController *)[nvc topViewController];

        // Now that we have the reference to our view controller, we can set its properties here:
        vc.myAwesomeProperty = @"awesome!";
    }
}

उम्मीद है की यह मदद करेगा!

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