আইফোন: নেভিগেশন বার সহ মডেল ইউআইটিএবলভিউ নিয়ন্ত্রণকারী দেখান


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];

আপনার মডেল কন্ট্রোলার নিজস্ব নেভিগেশন স্ট্যাক পরিচালনা করবে।


ধন্যবাদ, আমি ব্যাখ্যাটির প্রশংসা করি তাই আমি জানি যে আমি কী ভুল করেছি।
নিক হাববার্ড

4
আপনি যদি স্টোরিবোর্ড ব্যবহার করেন তবে এটি সম্পাদন করার জন্য কোনও কোডিং জড়িত নেই। ভাল সমাধান!
জেলি

36

স্টোরিবোর্ডে অ্যাপলের টিউটোরিয়াল প্রস্তাবিত যারা স্টোরিবোর্ড ব্যবহার করছেন তাদের জন্য নেভিগেশন বার প্রদর্শন করার একটি উপায় এখানে ।

কোনও মডেল ভিউ কন্ট্রোলার নেভিগেশন স্ট্যাকের সাথে যুক্ত না হওয়ার কারণে এটি টেবিল ভিউ নিয়ন্ত্রকের নেভিগেশন নিয়ন্ত্রক থেকে নেভিগেশন বার পায় না। মোডলি উপস্থাপন করার সময় ভিউ কন্ট্রোলারটিকে একটি নেভিগেশন বার দেওয়ার জন্য, এটিকে তার নিজস্ব নেভিগেশন নিয়ামকে এম্বেড করুন।

  1. বাহ্যরেখা ভিউতে, দেখুন নিয়ন্ত্রক নির্বাচন করুন।
  2. নির্বাচিত দর্শন নিয়ন্ত্রক সহ, সম্পাদক> এম্বেড ইন> নেভিগেশন নিয়ন্ত্রক চয়ন করুন choose

আপনি ন্যাভিগেশন কন্ট্রোলারে মডেল
সেগ

টুইটারের সম্পাদনা ব্যবহারকারী প্রোফাইল পৃষ্ঠাতে। এটি একটি আধুনিকভাবে উপস্থাপিত ইউআইটিএবলভিউ কনট্রোলার এবং এটির শীর্ষে ডোন এবং ক্যানসেল বোতাম রয়েছে। এই উত্তরটি সেই পরিস্থিতিতে শব্দার্থিকভাবে কোনও অর্থ দেয় না কারণ কোনও নেভিগেশন ঘটছে না।
উইলিয়াম এন্টারিকেন

17

আইওএস 7 এ এবং আপনি কেবলমাত্র শিরোনাম এবং কিছু বোতাম দেখানোর জন্য আপনার মডেল ভিউ কন্ট্রোলারের নেভিগেশন বার চান? আপনার ইউআইটিএবল ভিউ কনট্রোলারটিতে এই যাদুটি ব্যবহার করে দেখুন:

// 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];
}

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

4
আজকাল আপনি এটি আরও ভাল একটি নেভিগেশন নিয়ামক এম্বেড করা হবে।
ম্যালহাল

এটি একটি দুর্দান্ত সমাধান তবে একটি ছোট সমস্যা হ'ল আপনি যখন সেল শিরোনাম শিরোনামগুলি নেভিগেশন বারের শীর্ষে প্রদর্শন করবেন।
আলী

আমি [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

আমাদের প্রকল্পে এই সিগ থাকার পরে আমরা আর আমাদের স্টোরিবোর্ডগুলিতে মধ্যবর্তী নেভিগেশন কন্ট্রোলার তৈরি করি না, আমরা কেবল এই মোডালপ্রেসিভেশনবিহীন নেভিগেশনবারসাগুলির মতো ব্যবহার করি:

উপস্থাপক উপাচার্য -> উপস্থাপক উপাচার্য

আমি আশা করি যে এই উত্তরটি সেই লোকদের পক্ষে সহায়ক হবে যারা তাদের অ্যাপস স্টোরিবোর্ডগুলিতে অপ্রয়োজনীয় সদৃশতা এড়াতে পছন্দ করেন।


5

আপনার যদি কেবল একটির প্রয়োজন হয় NavigationBarতবে আপনি একটি উদাহরণ যোগ করতে UINavigationBarএবং এটিতে বারআইটেমগুলি বরাদ্দ করতে পারেন।


এটি ভিউকন্ট্রোলারের উপর নির্ভর করে: আমি মনে করি আপনি একটি ইউআইটিএবল ভিউ কনট্রোলারের সাথে একটি ইউআইএনএভিগেশন বার যুক্ত করতে পারবেন না, আপনি কি পারেন?
টোবিয়াস

আইবিতে, সম্পাদক -> নেভিগেশন কন্ট্রোলারে এম্বেড করুন এবং আপনার কাছে নেভিগেশন বার থাকবে। এটিকে বারবটন আইটেমগুলি টানুন এবং যুক্ত করুন।
অমিতাবি

5

@ স্কট যা বলেছিল তাতে আমি কেবল কিছু যুক্ত করতে চেয়েছি। তার উত্তরটি অবশ্যই স্টোরিবোর্ডস, আইওএস 7 এবং 8 ... (এবং শীঘ্রই, 9) এর সাথে এটি করার সহজতম এবং সর্বাধিক গ্রহণযোগ্য উপায়।

অবশ্যই স্টোরিবোর্ডে একটি ভিউ কন্ট্রোলার যুক্ত করা এবং @ স্কট দ্বারা বর্ণিত হিসাবে এটি এম্বেড করা যাওয়ার সঠিক উপায়।

তারপরে, সোর্স ভিউ কন্ট্রোলার থেকে লক্ষ্যটিতে (যার মাধ্যমে আপনি মডেলটি দেখাতে চান) নিয়ন্ত্রণ-টেনে কন্ট্রোল-টেনে সিগ যুক্ত করুন, যখন সিগির ধরণের পছন্দগুলির সাথে সামান্য দৃষ্টিভঙ্গি উপস্থিত হবে তখন "বর্তমান মোডালি" নির্বাচন করুন। সম্ভবত এটির একটি নাম দেওয়াও ভাল (নীচের উদাহরণে আমি "presentMyModalViewController" ব্যবহার করি)।

আমার যে জিনিসটির প্রয়োজন ছিল তা হ'ল @ স্কটের ক্ষেত্রে হ'ল আপনি যখন কিছুটা ডেটা নেভিগেশন কন্ট্রোলারে এম্বেড করা মোডালি-উপস্থাপিত ভিউ কন্ট্রোলারের কাছে দিতে চান।

আপনি যদি সিগু.ডেসটিনেশনভিউ কন্ট্রোলার দখল করেন তবে এটি ইউআইএনএভিগেশন কন্ট্রোলার হবে, আপনি ইউআইএনএভিগেশন কন্ট্রোলারের মধ্যে এম্বেড করা নিয়ামক নয়।

সুতরাং, নেভিগেশন কন্ট্রোলারের অভ্যন্তরে এমবেড করা ভিউ কন্ট্রোলারটি পেতে, আমি যা করেছি তা এখানে:

- (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!";
    }
}

আশাকরি এটা সাহায্য করবে!

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