سؤال

أحاول إضافة زر تحديث إلى الشريط العلوي لوحدة تحكم التنقل دون نجاح.

هنا هو الرأس:

@interface PropertyViewController : UINavigationController {

}

إليك كيف أحاول إضافتها:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain
                                          target:self action:@selector(refreshPropertyList:)];      
        self.navigationItem.rightBarButtonItem = anotherButton;
    }
    return self;
}
هل كانت مفيدة؟

المحلول

ومحاولة القيام بذلك في viewDidLoad. عموما يجب أن تؤجل أي شيء يمكنك حتى هذه النقطة على أية حال، عندما يتم inited على UIViewController لا يزال قد يكون بعض الوقت قبل أن يعرض، لا جدوى من القيام بأعمال في وقت مبكر وربط الذاكرة.

- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)];          
  self.navigationItem.rightBarButtonItem = anotherButton;
  // exclude the following in ARC projects...
  [anotherButton release];
}

وأما لماذا لا يعمل حاليا، لا أستطيع أن أقول مع اليقين 100٪ دون رؤية رمز أكثر، ولكن الكثير من الاشياء يحدث بين الحرف الأول وعرض تحميل، وكنت قد تفعل شيئا يسبب navigationItem لإعادة بينهما.

نصائح أخرى

وحاول إضافة زر إلى navigationItem وحدة تحكم الرأي القائل بأن سوف يتم دفع على هذه الفئة PropertyViewController قمت بإنشائها.

وهذا هو:

MainViewController *vc = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
[infoButton addTarget:self action:@selector(showInfo) forControlEvents:UIControlEventTouchUpInside];
vc.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:infoButton] autorelease];

PropertyViewController *navController = [[PropertyViewController alloc] initWithRootViewController:vc];

والآن، وهذا infoButton التي تم إنشاؤها برمجيا سوف تظهر في شريط التنقل. والفكرة هي أن وحدة تحكم الملاحة تلتقط المعلومات شاشته (العنوان، أزرار، الخ) من UIViewController أنه على وشك عرضه. لم يكن في الواقع إضافة أزرار وهذا مباشرة إلى UINavigationController.

يبدو أن بعض الأشخاص (مثلي) قد يأتون إلى هنا للبحث عن كيفية إضافة زر شريط التنقل في Interface Builder.الجواب أدناه يوضح كيفية القيام بذلك.

أضف وحدة تحكم التنقل إلى لوحة العمل الخاصة بك

حدد وحدة تحكم العرض الخاصة بك ثم اختر في قائمة Xcode المحرر > تضمين > وحدة التحكم في التنقل.

enter image description here

وبدلاً من ذلك، يمكنك إضافة أ UINavigationBar من مكتبة الكائنات.

إضافة عنصر زر شريط

اسحب أ UIBarButtonItem من مكتبة الكائنات إلى شريط التنقل العلوي.

enter image description here

يجب أن تبدو هذه:

enter image description here

تعيين السمات

يمكنك النقر نقرًا مزدوجًا فوق "العنصر" لتغيير النص إلى شيء مثل "تحديث"، ولكن هناك رمزًا فعليًا له ينعش التي يمكنك استخدامها.ما عليك سوى اختيار مفتش السمات لـ UIBarButtonItem ولل عنصر النظام يختار ينعش.

enter image description here

سيعطيك ذلك رمز التحديث الافتراضي.

enter image description here

إضافة إجراء IB

التحكم في السحب من UIBarButtonItem إلى وحدة تحكم العرض لإضافة @IBAction.

class ViewController: UIViewController {

    @IBAction func refreshBarButtonItemTap(sender: UIBarButtonItem) {

        print("How refreshing!")
    }

}

هذا كل شيء.

وهناك زر النظام الافتراضي ل "التجديد":

- (void)viewDidLoad {
    [super viewDidLoad];

    UIBarButtonItem *refreshButton = [[[UIBarButtonItem alloc] 
                            initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
                            target:self action:@selector(refreshClicked:)] autorelease];
    self.navigationItem.rightBarButtonItem = refreshButton;

}

- (IBAction)refreshClicked:(id)sender {

}

ويمكنك استخدام هذا:

الهدف-C

UIBarButtonItem *rightSideOptionButton = [[UIBarButtonItem alloc] initWithTitle:@"Right" style:UIBarButtonItemStylePlain target:self action:@selector(rightSideOptionButtonClicked:)];          
self.navigationItem.rightBarButtonItem = rightSideOptionButton;

وسويفت

let rightSideOptionButton = UIBarButtonItem()
rightSideOptionButton.title = "Right"
self.navigationItem.rightBarButtonItem = rightSideOptionButton
-(void) viewWillAppear:(BOOL)animated
{

    UIButton *btnRight = [UIButton buttonWithType:UIButtonTypeCustom];
    [btnRight setFrame:CGRectMake(0, 0, 30, 44)];
    [btnRight setImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal];
    [btnRight addTarget:self action:@selector(saveData) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *barBtnRight = [[UIBarButtonItem alloc] initWithCustomView:btnRight];
    [barBtnRight setTintColor:[UIColor whiteColor]];
    [[[self tabBarController] navigationItem] setRightBarButtonItem:barBtnRight];

}

لسريع 2:

self.title = "Your Title"

var homeButton : UIBarButtonItem = UIBarButtonItem(title: "LeftButtonTitle", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("yourMethod"))

var logButton : UIBarButtonItem = UIBarButtonItem(title: "RigthButtonTitle", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("yourMethod"))

self.navigationItem.leftBarButtonItem = homeButton
self.navigationItem.rightBarButtonItem = logButton

وهنا هو الحل في سويفت (مجموعة خيارات حسب الحاجة):

var optionButton = UIBarButtonItem()
optionButton.title = "Settings"
//optionButton.action = something (put your action here)
self.navigationItem.rightBarButtonItem = optionButton

لماذا أنت فرعية UINavigationController؟ ليست هناك حاجة إلى فئة فرعية أنه إذا كان كل ما عليك القيام به هو إضافة زر إلى ذلك.

وإعداد تسلسل هرمي مع UINavigationController في القمة، ثم في طريقة viewDidLoad: بك الجذر تحكم طريقة العرض: إعداد زر وإرفاقه عناصر الاستكشاف من خلال الدعوة

[[self navigationItem] setRightBarButtonItem:myBarButtonItem];

ويمكنك محاولة

self.navigationBar.topItem.rightBarButtonItem = anotherButton;

وسويفت 4:

override func viewDidLoad() {
    super.viewDidLoad()

    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "tap me", style: .plain, target: self, action: #selector(onButtonTap))
}

@objc func onButtonTap() {
    print("you tapped me !?")
}
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 110, 50)];
view.backgroundColor = [UIColor clearColor];

UIButton *settingsButton =  [UIButton buttonWithType:UIButtonTypeCustom];
[settingsButton setImage:[UIImage imageNamed:@"settings_icon_png.png"] forState:UIControlStateNormal];
[settingsButton addTarget:self action:@selector(logOutClicked) forControlEvents:UIControlEventTouchUpInside];
[settingsButton setFrame:CGRectMake(40,5,32,32)];
[view addSubview:settingsButton];

UIButton *filterButton =  [UIButton buttonWithType:UIButtonTypeCustom];
[filterButton setImage:[UIImage imageNamed:@"filter.png"] forState:UIControlStateNormal];
[filterButton addTarget:self action:@selector(openActionSheet) forControlEvents:UIControlEventTouchUpInside];
[filterButton setFrame:CGRectMake(80,5,32,32)];
[view addSubview:filterButton];



self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:view];

وحاول this.It العمل بالنسبة لي.

شريط التنقل وصورة خلفية أضاف أيضا إلى الزر الأيمن.

 UIBarButtonItem *Savebtn=[[UIBarButtonItem alloc]initWithImage:[[UIImage    
 imageNamed:@"bt_save.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] 
 style:UIBarButtonItemStylePlain target:self action:@selector(SaveButtonClicked)];
 self.navigationItem.rightBarButtonItem=Savebtn;

استخدم هذا الرمز لشريط التنقل الزر الأيمن مع العنوان الخاص بك فاز واستدعاء أسلوب بعد انقر الزر الأيمن.

UIBarButtonItem *btnSort=[[UIBarButtonItem alloc]initWithTitle:@"right" style:UIBarButtonItemStylePlain target:self action:@selector(sortedDataCalled)];
   self.navigationItem.rightBarButtonItem=btnSort;
}

-(void)sortedDataCalled {
    NSLog(@"callBtn");    
}
    UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(add:)];
self.navigationItem.rightBarButtonItem = rightBarButtonItem;
- (void)viewWillAppear:(BOOL)animated
{    
    [self setDetailViewNavigationBar];    
}
-(void)setDetailViewNavigationBar
{
    self.navigationController.navigationBar.tintColor = [UIColor purpleColor];
    [self setNavigationBarRightButton];
    [self setNavigationBarBackButton];    
}
-(void)setNavigationBarBackButton// using custom button 
{
   UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithTitle:@"  Back " style:UIBarButtonItemStylePlain target:self action:@selector(onClickLeftButton:)];          
   self.navigationItem.leftBarButtonItem = leftButton;    
}
- (void)onClickLeftButton:(id)sender 
{
   NSLog(@"onClickLeftButton");        
}
-(void)setNavigationBarRightButton
{

  UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain target:self action:@selector(onClickrighttButton:)];          
self.navigationItem.rightBarButtonItem = anotherButton;   

}
- (void)onClickrighttButton:(id)sender 
{
   NSLog(@"onClickrighttButton");  
}
    self.navigationItem.rightBarButtonItem =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshData)];



}

-(void)refreshData{
    progressHud= [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
    [progressHud setLabelText:@"拼命加载中..."];
    [self loadNetwork];
}

ويجب إضافة barButtonItem الخاصة بك في طريقة - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated.

ومجرد نسخ ولصق هذا الرمز الهدف-C.

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self addRightBarButtonItem];
}
- (void) addRightBarButtonItem {
    UIButton *btnAddContact = [UIButton buttonWithType:UIButtonTypeContactAdd];
    [btnAddContact addTarget:self action:@selector(addCustomerPressed:) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:btnAddContact];
    self.navigationItem.rightBarButtonItem = barButton;
}

#pragma mark - UIButton
- (IBAction)addCustomerPressed:(id)sender {
// Your right button pressed event
}

يمكن أن تحدث هذه المشكلة إذا قمنا بحذف وحدة التحكم في العرض أو حاولنا إضافة وحدة تحكم عرض جديدة داخل منشئ الواجهة (main.storyboard).لإصلاح هذه المشكلة، يتطلب الأمر إضافة "عنصر التنقل" داخل وحدة تحكم العرض الجديدة.يحدث أحيانًا أننا نقوم بإنشاء شاشة تحكم عرض جديدة ولا تتصل بـ "عنصر التنقل" تلقائيًا.

  1. انتقل إلى main.storyboard.
  2. حدد وحدة تحكم العرض الجديدة هذه.
  3. انتقل إلى مخطط الوثيقة.
  4. تحقق من عرض محتويات وحدة التحكم.
  5. إذا لم تكن وحدة تحكم العرض الجديدة تحتوي على عنصر تنقل، فانسخ عنصر التنقل من وحدة تحكم العرض السابقة وألصقه في وحدة تحكم العرض الجديدة.
  6. حفظ وتنظيف المشروع.

وأيضا كنت قادرا على إضافة أزرار متعددة باستخدام rightBarButtonItems

-(void)viewDidLoad{

    UIBarButtonItem *button1 = [[UIBarButtonItem alloc] initWithTitle:@"button 1" style:UIBarButtonItemStylePlain target:self action:@selector(YOUR_METHOD1:)];
    UIBarButtonItem *button2 = [[UIBarButtonItem alloc] initWithTitle:@"button 2" style:UIBarButtonItemStylePlain target:self action:@selector(YOUR_METHOD2:)];

    self.navigationItem.rightBarButtonItems = @[button1, button2];
}

وArtilheiro: إن ه مشروع navigationbased، ش يمكن أن تخلق BaseViewController. وعن الرأي الآخر يرث هذا BaseView. في BaseView ش يمكن تحديد طرق عامة لإضافة الزر الأيمن أو تغيير نص الزر الأيسر.

مثال:

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

وinterface BaseController: UIViewController {

     

و}   - (الفراغ) setBackButtonCaption: (NSString *) شرح؛

     

و(الفراغ) setRightButtonCaption: (NSString *) شرح selectot: (SEL) محدد؛

     

وend   // في BaseView.M

     

و(الفراغ) setBackButtonCaption: (NSString *) شرح   {

UIBarButtonItem *backButton =[[UIBarButtonItem alloc] init];

backButton.title= caption;
self.navigationItem.backBarButtonItem = backButton;
[backButton release];
<اقتباس فقرة>   

و}   - (الفراغ) setRightButtonCaption: (NSString *) شرح selectot: (SEL) محدد   {

  UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] init];
rightButton.title = caption;

rightButton.target= self;

[rightButton setAction:selector];

self.navigationItem.rightBarButtonItem= rightButton;

[rightButton release];
<اقتباس فقرة>   

و}

والآن في أي عرض مخصصة وتنفيذ هذا الرأي قاعدة استدعاء الأساليب:

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

وinterface LoginView: BaseController {

في بعض الطرق طريقة دعوة القاعدة على النحو التالي:

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

وSEL SEL =selector (switchToForgotPIN)؛

     

[سوبر setRightButtonCaption: @ "نسيت PIN" selectot: قانون حالة الطوارئ]؛

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