سؤال

"زر الرجوع" لـ أ UINavigationController يعرض افتراضيًا عنوان العرض الأخير في المكدس.هل هناك طريقة للحصول على نص مخصص في زر الرجوع بدلاً من ذلك؟

هل كانت مفيدة؟

المحلول

من <لأ href = "http://blog.evandavey.com/2008/12/how-to-change-text-on-back-button-in-uinavigationbar-uinavigationcontroller.html" يختلط = "noreferrer" > هذا الرابط :

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

وكما قال تايلر في التعليقات:

<اقتباس فقرة>   

لا تفعل هذا في وحدة تحكم عرض مرئي، ولكن في وجهة النظر   وحدة التحكم التي كنت انظر إذا كنت اضغط على زر العودة

نصائح أخرى

يمكنك ضبط النص في Interface Builder:

حدد عنصر التنقل في ViewController الذي سيعود إليه زر الرجوع:

enter image description here

في مفتش سمات لوحة الأدوات المساعدة، أدخل التسمية الخاصة بك لزر الرجوع:

enter image description here

أفضل هذا الأسلوب على تحديد العنوان في الكود كما في الإجابة المقبولة.

لاحظ أيضًا أنك تحتاج إلى القيام بذلك في وحدة التحكم في العرض مستوى واحد أعلى المكدس.بمعنى آخر ، لا تفعل هذا في وحدة التحكم في العرض المرئي ، ولكن في وحدة التحكم في العرض ، سترى ما إذا كنت تضغط على زر العودة.
--تايلر

وأنا استخدم هذا:

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

ولقد وجدت الحل في متناول اليد لهذا ببساطة عن طريق وضع عنوان وحدة تحكم قبل دفع وحدة تحكم أخرى إلى المكدس، مثل هذا:

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

وبعد ذلك، تأكد من تعيين العنوان الأصلي في viewWillAppear، مثل هذا:

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

وهذا يعمل لأن السلوك الافتراضي UINavigationController عند بناء الزر الخلفي أثناء عملية دفع هو استخدام اللقب من وحدة تحكم السابق.

وعنوان الافتراضات زر الرجوع لعنوان العرض السابق بحيث خدعة سريعة الأول هو استخدام لوضع التعليمات البرمجية التالية في الملف. م الرأي السابق.

-(void)viewWillAppear:(BOOL)animated {

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

-(void)viewWillDisappear:(BOOL)animated {

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

وفي طريقة الحرف الأول الخاص بك، قم بإضافة التعليمة البرمجية التالية:

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

وبعد ذلك إضافة أسلوب بسيط، للسماح viewcontroller نافيا:

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

قم بإضافة التعليمات البرمجية التالية في viewDidLoad أو loadView

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

واختبرته في اي فون وتطلب الشركة مع دائرة الرقابة الداخلية 9

إضافة إلى إجابة رين.لاحظ من مستندات Apple أن إعلان backBarButtonItem هذا هو:

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

أتمنى أن يساعدك هذا!

- (void)viewDidLoad {
  [super viewDidLoad];

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

ولقد اكتشفت شيئا للاهتمام. إذا كنت فئة فرعية UINavigationController وتجاوز أسلوب pushViewController:animated: والقيام بشيء من هذا القبيل: (نضع في اعتبارنا أن أنا باستخدام ARC)

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

viewController.navigationItem.backBarButtonItem = backButton;

[super pushViewController:viewController animated:animated];

وبعد ذلك لجميع ViewControllers التي دفعت مع وحدة تحكم الملاحة الخاص بك سيكون على زر "رجوع" فيها تلقائيا. إذا كنت ترغب في تغيير النص لوحدات التحكم عرض بعض يمكنك أن تجرب، وربما يلقي viewcontroller لفئة معينة أو بروتوكول عهدك الخاصة (الذي يرث viewcontroller الخاص بك الذي يمكن أن يكون وسيلة مثل backButtonText أو شيء سخيف من هذا القبيل) التي يمكن أن تعطي لك معلومات معينة على viewcontroller الذي سيأتي في sothat يمكنك تخصيص نص الزر مرة أخرى لذلك. الآن يتم أخذ نص الزر الخلفي من الرعاية في المكان الذي ينبغي أن تعقد المسؤولية وحدها. لا بد لي من الاعتراف بأن خلق زر جديد لتغيير النص تمتص، ولكن يا جيدا.

ويمكن لأي شخص أن يفكر في سبب لماذا لا تفعل مثل هذا؟ أتلست لم يكن لديك إلى عزف مع العناوين viewcontroller أو أن تتذكر لإنشاء زر الخلفي الجديد قبل دفع viewcontroller على وحدة تحكم الملاحة.

والجواب العنان ليعمل بشكل جيد.

لاحظ أنه إذا كنت تدفع تحكم أكثر من رأي واحد، وسوف تظهر تغيرت مرة أخرى عنوان زر لكل منهما، والتي قد لا تكون ما تريد.

في هذه الحالة، سوف تحتاج إلى إنشاء مخصص UIBarButtonItem كل مرة يتم فيها دفع وحدة تحكم الرأي.

وأيضا، تأكد من أن تفعل ذلك قبل دفع تحكم الرأي، وإلا فإنك سوف تحصل على زوبعة الشاشة مع تغير العنوان.

والتوسع في اقتراح أوبري، يمكنك القيام بذلك في وحدة تحكم عرض الطفل:

وإنشاء اثنين من المتغيرات لتخزين القيم القديمة من navigationItem.title الوالدين والأم navigationItem

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

وانها ليست مثالية. سترى والرسوم المتحركة عنوان تغيير رأي الأم وحدة تحكم جديدة في. ولكن هذا لا تحقيق الهدف المتمثل في العرف وصفها على الزر مرة أخرى والحفاظ عليه على شكل زر الخلفي القياسي.

ووضع هذا في لك viewDidLoad، نأمل أن يؤدي إلى ما كنت تبحث عن

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

إذا أردت تعيين عنوان في التوصل تحكم (في بعض الأحيان أكثر المنطق ..) في السريع 3 تأليف:

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)
}

وعادة أضع self.setBackButtonNavBar في تمديد تحكم.

وأعرف أن هذا هو السؤال القديم ونوع الأجوبة "من خارج تحديث!

والطريق السهل هو أن تفعل هذا في الأصل ViewController:

وأي بمعنى واحد أن يأخذك إلى وحدة تحكم رأي المقبل.

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

والقيام بذلك في التعليمات البرمجية إزالة نمط الزر الخلفي من UINavigationConroller. إذا قمت بإضافة عنصر الإنتقال في كل وجهات النظر لك، يمكنك تعيين عنوان الجزء الخلفي بوتون في StoryBoard.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top