ইউআইএনএভিগেশন নিয়ন্ত্রণকারী "পিছনে বোতাম" কাস্টম পাঠ্য?


147

UINavigationControllerডিফল্টরূপে "পিছনের বোতাম" স্ট্যাকের সর্বশেষ দর্শনের শিরোনাম দেখায়। পরিবর্তে পিছনের বোতামে কাস্টম পাঠ্য থাকার কোনও উপায় আছে?


1
আমার জন্য এই কাজself.navigationController.navigationBar.topItem.title = @"Custom text";
huync

উত্তর:


342

এই লিঙ্ক থেকে :

self.navigationItem.backBarButtonItem =
   [[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
            style:UIBarButtonItemStylePlain
           target:nil
           action:nil];

যেমন টাইলার মন্তব্যগুলিতে বলেছেন:

দৃশ্যমান ভিউ কন্ট্রোলারে এটি করবেন না, তবে ভিউ কন্ট্রোলারে আপনি যদি পিছনের বোতামটি চাপেন তবে দেখতে পাবেন


4
আপনি উচিত । releaseUIBarButtonItem
মেহরদাদ আফশারি

217
এছাড়াও নোট করুন, আপনাকে স্ট্যাকের এক স্তর পর্যন্ত ভিউ কন্ট্রোলারে এটি করতে হবে। অন্য কথায়, দৃশ্যমান ভিউ কন্ট্রোলারে এটি করবেন না, তবে ভিউ কন্ট্রোলারে আপনি যদি পিছনের বোতামটি আঘাত করেন তবে দেখতে পাবেন।
টাইলার

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

3
পরামর্শ: শৈলী অনুমান করার পরিবর্তে বর্তমানে নির্ধারিত স্টাইলটি পাস করুন। এই উত্তরের কোডে, UIBarButtonItemStyleBorderedসম্পত্তিটিতে কল দিয়ে প্রতিস্থাপন করুন self.navigationItem.backBarButtonItem.style। ডকুমেন্টেশন: ডেভেলপার.এপল.
com

1
নোট করুন যে এআরসি এর অধীনে আপনাকে অবশ্যই অটোরিলিজ কলটি ছেড়ে যেতে হবে। সুতরাং আপনার কাছে স্ব-নেভিগেশন আইটেম.ব্যাকবারবারটন আইটেম = [[ইউআইবারবার বাটন আইটেম বরাদ্দ] ইনিউইন শিরোনাম: @ "কাস্টম শিরোনাম" শৈলী: UIBarButtonItemStyleBordered লক্ষ্য: নীল ক্রিয়া: শূন্যস্থান];
bkbeachlabs

43

আপনি পাঠ্যটি ইন্টারফেস বিল্ডারে সেট করতে পারেন:

ভিউকন্ট্রোলারের নেভিগেশন আইটেমটি নির্বাচন করুন যাতে পিছনের বোতামটি ফিরে আসবে:

এখানে চিত্র বর্ণনা লিখুন

ইউটিলিটিস প্যানেল অ্যাট্রিবিউট ইন্সপেক্টরটিতে, পিছনের বোতামটির জন্য আপনার লেবেলটি প্রবেশ করুন:

এখানে চিত্র বর্ণনা লিখুন

আমি গ্রহণযোগ্য উত্তর হিসাবে কোড শিরোনাম সেট করার চেয়ে এই পদ্ধতির পছন্দ করব।

এছাড়াও নোট করুন, আপনাকে স্ট্যাকের এক স্তর পর্যন্ত ভিউ কন্ট্রোলারে এটি করতে হবে। অন্য কথায়, দৃশ্যমান ভিউ কন্ট্রোলারে এটি করবেন না, তবে ভিউ কন্ট্রোলারে আপনি যদি পিছনের বোতামটি আঘাত করেন তবে দেখতে পাবেন।
--Tyler


আমি এখনও অবধি খুঁজে পাওয়া এটিই সেরা উত্তর।
অয়ন সেনগুপ্ত

2
পরিষ্কার হওয়ার জন্য, এটিকে ভিউ কন্ট্রোলারের নেভিগেশন আইটেমটিতে সেট করা দরকার, ভিউ কন্ট্রোলারের বৈশিষ্ট্য পরিদর্শক নিজেই নয়।
প্যাট্রিক

এটি আমি খুঁজে পেয়েছি সেরা উত্তর।
বাইসপজাই

এটি সেরা উত্তর
অ্যালেক্স ব্রাউন

2
এক্সকোড .1.১.১ এবং আইওএস in-তে চলমান, মনে হয় আপনার পূর্ববর্তী ভিউ শিরোনামটি এখানে আপনি যেই ব্যাক বোতামের শিরোনাম সেট করবেন তা ওভাররাইড করবে। পূর্ববর্তী দর্শনের শিরোনামে যদি 11 টি অক্ষরের সীমা বেশি থাকে তবে পরবর্তী দর্শনের পিছনের বোতামটি কেবল "পিছনে" বলবে। এখানে শীর্ষে-দেওয়া উত্তরে বর্ণিত হিসাবে স্ক্র্যাচ থেকে নতুন এনএভি বার আইটেম তৈরি করা ছাড়া এর চারপাশের কোনও উপায় নেই।
রে

22

আমি এটি ব্যবহার:

// In the current view controller, not the one that is one level up in the stack
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.navigationBar.backItem.title = @"Custom text";
}

এটি প্রায়শই আমার জন্য কাজ করে তবে আমি যখন পিছনের বোতামটি ক্লিক করি তখন পাঠ্যটি অ্যানিমেশনের সময়কালের জন্য পিতামাতার শিরোনামে ফিরে আসে :-(
ড্যানি টুপেনি

3
এটি স্ট্যাকের মধ্যে নিয়ন্ত্রণকারীর পিছনে বোতামের শিরোনাম পরিবর্তন করে। এটি বর্তমানে প্রদর্শিত কন্ট্রোলারের ব্যাক বোতামের শিরোনাম পরিবর্তন করে না। আরও খারাপ: এটি পূর্ববর্তী নিয়ামকের আগের নিয়ামকের শিরোনাম পরিবর্তন করে!
লিবিয়াথন

অন্যান্য মন্তব্যকারীদের দ্বারা উল্লিখিত হিসাবে, এই পদ্ধতিটি কিছুটা অক্ষম। আমি এটি করার পরামর্শ দিচ্ছি না কারণ এটি API কীভাবে এটি ব্যবহার করতে চায় তা সত্যিই নয়। আপনি ভবিষ্যতে কঠিন বাগের জন্য নিজেকে সেট আপ করতে পারেন!
রিকডিটি

11

আমি স্ট্যাকের উপরে অন্য কোনও নিয়ামককে চাপ দেওয়ার আগে কেবল নিয়ামকের শিরোনাম সেট করে এর একটি সহজ সমাধান খুঁজে পেয়েছি:

self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];

তারপরে, এটির মতো মূল শিরোনামটি নিশ্চিত করে নিন viewWillAppear:

-(void)viewWillAppear:(BOOL)animated
{
  ...
  self.navigationItem.title = @"Original Title";
  ...
}

এটি কাজ করে কারণ UINavigationControllerপুশ অপারেশনের সময় পিছনের বোতামটি তৈরি করার সময় পূর্ববর্তী নিয়ামকটির শিরোনামটি ব্যবহার করার সময় এর ডিফল্ট আচরণ ।


1
এটির সাথে সমস্যাটি হ'ল পুরানো ভিউতে শিরোনাম পরিবর্তিত হওয়ায় এটি অ্যানিমেটেড হয় এবং কিছুটা ন্যাফ লাগে। প্রদত্ত সমাধানগুলির
কোনওটিই

1
এটি আমার পরিস্থিতিতে নিখুঁত কারণ আমি আগের স্ক্রিনে নাভবারটি প্রদর্শন করি না এবং আমি কেবল নতুন স্ক্রিনের পিছনের বোতামটি থেকে শিরোনাম লেবেলটি সরাতে চাই এবং কেবল আইওএস 7 শেভরন তীরটি পেতে চাই। আমি কেবল শিরোনামের জন্য একটি খালি এনএসএসআর্টিং আক্ষরিক সেট করতে পারি।
1313

পিছনে
সুমিত

7

পিছনের বোতামটির শিরোনাম পূর্ববর্তী দর্শনের শিরোনামের ডিফল্ট হয় তাই আমি যে দ্রুত কৌশল ব্যবহার করি তা হ'ল নিম্নলিখিত কোডটি পূর্ববর্তী ভিউ .এম ফাইলের মধ্যে স্থাপন করা।

-(void)viewWillAppear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Original Title";
}

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Back";
}

এটি বেশ কয়েকটি ক্ষেত্রে কার্যকরভাবে কাজ করে এবং এটি বেশ সহজ ... কেবল পর্যবেক্ষণ হ'ল এই পদ্ধতির যে কোনও একটিকে ওভাররাইড করার জন্য সুপারের বাস্তবায়নটি নতুন পদ্ধতির কোনও পর্যায়ে ডাকা উচিত be
izk

2
এই পদ্ধতির সাহায্যে ধাক্কা অ্যানিমেশনটি হওয়ার আগে পিতামাতার ভিউয়ের শিরোনামটিকে 'পিছনে' পরিবর্তন করা হবে। (এবং, বাছাই করা সাফল্য, আপনি যদি এটিকে ভিউডিডিস্পিয়ার পদ্ধতিতে সরিয়ে দেন তবে আপনি স্যুইচটি ধাক্কার পরে ঘটতে দেখবেন))
জেমস বাউচার

আমি এই পদ্ধতিটি পছন্দ করি তবে আমি যে সমস্যার মুখোমুখি হচ্ছি তা হ'ল "অরিজিনাল শিরোনাম" ঠিকঠাক হয়ে যায় তবে এটি "ব্যাক" এর চেয়ে বেশি দীর্ঘ হলে এটি একটি উপবৃত্ত নিয়ে আসে যা অবশ্যই হওয়া উচিত কারণ যেহেতু দৃশ্যটি এখনও ভিউক্রমক্রমের মধ্যে নেই , এটি শিরোনাম দৃশ্যটি রিলেআউট করে না। অ্যানিমেশনের দ্রুত প্রারম্ভিক গতির কারণে উপরের @ জেমসবাউচারের দ্বারা বর্ণিত সমস্যাটি আমার পক্ষে অদৃশ্য। প্রকৃতপক্ষে, আমি কেবল বুঝতে পেরেছিলাম যে ধীরে ধীরে শেষ হওয়া অ্যানিমেশনটির কারণে আমি যে সমস্যার মুখোমুখি হয়েছি তা বিশেষভাবে লক্ষণীয় যা এই সমস্যাটি যখন শীর্ষস্থানীয় হয়।
trss

স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ১৪৪69 69 9 / / / এ উত্তরটি প্রয়োজনের তুলনায় আরও কাস্টমাইজেশনের মতো মনে হচ্ছে, এটি নথিবদ্ধ উপায় এবং আরও গুরুত্বপূর্ণভাবে আমাদের উদ্দেশ্যতে আরও জড়িত বলে মনে হচ্ছে।
trss

6

আপনার init পদ্ধতিতে, নিম্নলিখিত কোডটি যুক্ত করুন:

- (id)initWithStyle:(UITableViewStyle)style {
    if(self = [super init]) {

        //...

        UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                                             style:UIBarButtonItemStylePlain 
                                            target:self 
                                            action:@selector(goBack)];
        self.navigationItem.leftBarButtonItem = customBackButton;
        [customBackButton release];

        //...
    }
    return self;
}

তারপরে ভিউকন্ট্রোলারকে বরখাস্ত করার জন্য একটি সহজ পদ্ধতি যুক্ত করুন:

-(void)goBack {
    [self.navigationController popViewControllerAnimated:YES];  
}

3

ভিডডিলোড বা লোডভিউতে নিম্নলিখিত কোডটি যুক্ত করুন

self.navigationController.navigationBar.topItem.title = @"Custom text";

আমি এটি আইওএস 9 এর সাথে আইফোন এবং আইপ্যাডে পরীক্ষা করেছি


? Self.navigationController .navigationBar.backItem .title = "কাস্টম পাঠ্য" হওয়া উচিত
Peacemoon

1
কেবলমাত্র navigationControllertopItemself.navigationController?.navigationBar.topItem?.title = "Custom Text"
তফাতটিই

2

লাগামের উত্তর যোগ করা। অ্যাপলের ডক্স থেকে নোট করুন যে ব্যাকবার্ট বাটন আইটেমের ঘোষণাটি হ'ল :

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

অতএব, লাগামের উত্তর মেমরি ফাঁস করবে কারণ সংশ্লেষিত সেটারটি আপনি retainযে উদাহরণটি পাস করবেন সেটি হবে, যা কখনই স্পষ্টভাবে প্রকাশ হয় না। আপনি এটি ব্যবহার করে প্রতিকার করতে পারেনautorelease

 self.navigationItem.backBarButtonItem = 
      [[[UIBarButtonItem alloc] initWithTitle:@"Custom Title" 
         style:UIBarButtonItemStyleBordered
         target:nil
         action:nil] autorelease];  //<-- autoreleased

অথবা আপনি উদাহরণটিতে কোনও ভেরিয়েবল নির্দেশ করতে পারেন যাতে আপনি এটি পরে স্পষ্টভাবে প্রকাশ করতে পারেন:

UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];

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


আজকের দিনে, নোট করুন, আপনাকে অটোরিলেজ সম্পর্কে চিন্তা করার দরকার নেই (এবং সত্যই সংকলক ত্রুটিযুক্ত হবে যদি আপনি একটি আরসি-সক্ষম প্রকল্পে অটোরিলিজ করার চেষ্টা করেন)
এরিক গোল্ডবার্গ

2
- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;
  [backButton release];
}

2

আমি আকর্ষণীয় কিছু আবিষ্কার করেছি। আপনি যদি সাবক্লাসটি করেন UINavigationControllerএবং pushViewController:animated:পদ্ধতিটিকে ওভাররাইড করে এবং এর মতো কিছু করেন: (মনে রাখবেন যে আমি এআরসি ব্যবহার করছি)

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] 
 initWithTitle: @"Back" 
 style: UIBarButtonItemStyleBordered
 target: nil action: nil];

viewController.navigationItem.backBarButtonItem = backButton;

[super pushViewController:viewController animated:animated];

তারপরে ViewControllersআপনার নেভিগেশন কন্ট্রোলারের সাহায্যে ধাক্কা দেওয়া সমস্তগুলির জন্য স্বয়ংক্রিয়ভাবে সেগুলিতে "পিছনে" বোতামটি থাকবে। আপনি যদি কিছু নির্দিষ্ট ভিউ কন্ট্রোলারের জন্য পাঠ্য পরিবর্তন করতে চান তবে আপনি চেষ্টা করতে পারেন এবং ভিউকন্ট্রোলারকে একটি নির্দিষ্ট শ্রেণিতে বা আপনার নিজস্ব কাস্টম প্রোটোকলকে কাস্ট করতে পারেন (যা আপনার ভিউকন্ট্রোলার উত্তরাধিকার সূত্রে আসে যার মতো পদ্ধতিতে backButtonTextবা নির্বোধের মতো কিছু থাকতে পারে ) যা আপনাকে দিতে পারে সোটাতে যে ভিউ কন্ট্রোলার আসছে সে সম্পর্কে নির্দিষ্ট তথ্য আপনি এর জন্য পিছনের বোতামের পাঠ্যটি কাস্টমাইজ করতে পারেন। এখন পিছনের বোতামের পাঠ্যটি এমন জায়গায় যত্ন নেওয়া হয়েছে যা পুরোপুরি দায়বদ্ধ হওয়া উচিত। আমাকে স্বীকার করতে হবে যে পাঠ্যটি পরিবর্তন করতে একটি নতুন বোতাম তৈরি করা সফল হয়েছে, তবে ওহ ভাল।

কেউ কেন এমন কারণ না করে এর কারণ চিন্তা করতে পারে? কমপক্ষে আপনাকে ভিউকন্ট্রোলার শিরোনামগুলি নিয়ে গলগল করতে হবে না বা নেভিগেশন নিয়ামকটিতে ভিউকন্ট্রোলারকে চাপ দেওয়ার আগে একটি নতুন ব্যাক বোতাম তৈরির কথা মনে রাখতে হবে না।


0

লাগাম উত্তর ভাল কাজ করে।

মনে রাখবেন আপনি যদি একাধিক ভিউ নিয়ন্ত্রককে চাপ দেন তবে পরিবর্তিত ব্যাক বোতামের শিরোনাম তাদের প্রত্যেকের জন্য উপস্থিত হবে যা আপনি যা চান তা নাও হতে পারে।

সেক্ষেত্রে প্রতিবার আপনি কোনও নিয়ামককে চাপ দেওয়ার সময় কাস্টম UIBarButtonItem তৈরি করতে হবে।

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


0

অউব্রির পরামর্শকে প্রসারিত করে আপনি চাইল্ড ভিউ কন্ট্রোলারে এটি করতে পারেন:

পিতামাতার নেভিগেশন আইটেম.টাইটেল এবং পিতামাতার নেভিগেশন আইটেমের পুরানো মানগুলি সংরক্ষণ করার জন্য দুটি ভেরিয়েবল তৈরি করুন

UINavigationItem* oldItem;
NSString* oldTitle;

ইন viewDidLoad, নিম্নলিখিত যোগ করুন:

oldItem = self.navigationController.navigationBar.topItem;  
oldTitle = oldItem.title;  
[oldItem setTitle: @"Back"];  

ইন viewWillDisappear, নিম্নলিখিত যোগ করুন:

[oldItem setTitle: oldTitle];  
oldTitle = nil;  // do this if you have retained oldTitle
oldItem = nil;   // do this if you have retained oldItem

এটি নিখুঁত নয়। নতুন কন্ট্রোলারটি অ্যানিমেটেড হওয়ার সাথে সাথে আপনি প্যারেন্ট ভিউ পরিবর্তনের শিরোনাম দেখতে পাবেন B তবে এটি ব্যাক কাস্টম লেবেলিংয়ের লক্ষ্যটি অর্জন করে এবং এটি স্ট্যান্ডার্ড ব্যাক বোতামের মতো আকার ধারণ করে।


0

viewDidLoadএটি আপনার মধ্যে রাখুন , আশা করি এটি আপনি যা সন্ধান করছেন তাতে ফলাফল আসবে

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" 
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];

0

যদি আপনি দ্রুত নিয়ন্ত্রণে আগমনকারী নিয়ামক (কখনও কখনও আরও যুক্তিযুক্ত ..) এ শিরোনাম সেট করতে চান তবে:

func setBackButtonNavBar(title: String, delay: Double){

    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in

        if let navBar = self.navigationController?.navigationBar{
            navBar.backItem?.title = title
        }
    })

}

আসন্ন নিয়ামক:

override func viewDidLoad() {
    super.viewDidLoad()
    self.setBackButtonNavBar(title: "back", delay: 0.3)
}

সাধারণত আমি কন্ট্রোলার এক্সটেনশনে সেল্ফ.সেটব্যাকবটননবারকে রাখি।


0

আমি জানি এটি একটি পুরানো প্রশ্ন এবং উত্তরগুলির ধরণের আপডেট!

সহজ উপায় হ'ল পিতামাতার ভিউ কন্ট্রোলারে এটি করা:

অর্থাত্‍ আপনাকে পরবর্তী দেখার জন্য নিয়ামকের দিকে নিয়ে যায়।

self.navigationItem.backBarButtonItem  = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)

-1

কোডে এটি করার ফলে এর পিছনের বোতামের স্টাইলটি মুছে ফেলা হবে UINavigationConroller। আপনি যদি আপনার প্রতিটি দর্শনে নেভিগেশন আইটেম যুক্ত করেন তবে আপনি পিছনে বোটের শিরোনামটি সেট করতে পারেন StoryBoard

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