UIBarButtonItem недоступен для кликабельности

#objective-c #uibarbuttonitem #clickable

#objective-c #uibarbuttonitem #доступен для кликабельности

Вопрос:

У меня очень сложная проблема, и после долгих поисков (Google, stackoverflow, …) я не нашел решения, которое работает для меня.

Позвольте мне представить вам мою текущую выбранную архитектуру:

  1. У меня есть AppDelegate, у которого есть UIView, содержащий UINavigationController, и приложение, которое завершило запуск с параметрами: содержит:

     UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 400)];
      UIViewController *myController = [[UIViewController alloc] init];
      myController.view = myView;
    
    
          FSCScrumRootView * myRootView = [[FSCScrumRootView alloc] initWithNibName:@"FSCScrumRootView" bundle:[NSBundle mainBundle]];
    
          [myController.view addSubview:myRootView.navigation.view];
    
          [self.window addSubview:myController.view];
    
          [self.window makeKeyAndVisible];
          return YES;
        }
      
  2. В моем FSCScrumRootView (наследуется от UIViewController) я инициализирую представление следующим образом:

     - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
    { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    
    if (self) {
    // Custom initialization
    self.navigation = [[[UINavigationController alloc] init] autorelease];
    self.scrumProjectsList = [[[FSCScrumProjectListView alloc] init] initWithNibName:@"FSCScrumProjectListView" bundle:nil];
    [navigation pushViewController:scrumProjectsList animated:YES]; 
    
    [navigation view]; 
    } 
    return self; 
    } 
      
  3. В моем FSCScrumProjectListView (он унаследован от UITableViewController) я реализовал viewDidLoad следующим образом:

     - (void)viewDidLoad 
    { 
    [super viewDidLoad]; 
    
    //Set the title 
    self.navigationItem.title = @"Scrum Projects";
    
    UIBarButtonItem *myRefreshButton = [[[UIBarButtonItem alloc] initWithTitle:@"Refresh" style:UIBarButtonSystemItemRefresh target:self action:@selector(refreshList)] autorelease]; 
    self.navigationItem.leftBarButtonItem = myRefreshButton;
    
    UIBarButtonItem *myLogoutButton = [[UIBarButtonItem alloc] initWithTitle:@"Logout" style:UIBarButtonSystemItemCancel target:self action:@selector(logout)]; 
    self.navigationItem.rightBarButtonItem = myLogoutButton;
    
    
    //Initialize the toolbar
    toolbar = [[UIToolbar alloc] init];
    toolbar.barStyle = UIBarStyleDefault;
    
    //Set the toolbar to fit the width of the app.
    [toolbar sizeToFit];
    
    //Caclulate the height of the toolbar
    CGFloat toolbarHeight = [toolbar frame].size.height;
    
    //Get the bounds of the parent view
    CGRect rootViewBounds = self.parentViewController.view.bounds;
    
    //Get the height of the parent view.
    CGFloat rootViewHeight = CGRectGetHeight(rootViewBounds);
    
    //Get the width of the parent view,
    CGFloat rootViewWidth = CGRectGetWidth(rootViewBounds);
    
    //Create a rectangle for the toolbar
    CGRect rectArea = CGRectMake(0, rootViewHeight - toolbarHeight, rootViewWidth, toolbarHeight);
    
    //Reposition and resize the receiver
    [toolbar setFrame:rectArea];
    
    //Create a button
    UIBarButtonItem *infoButton = [[UIBarButtonItem alloc] 
                                 initWithTitle:@"Info" style:UIBarButtonItemStyleBordered target:self action:@selector(info_clicked:)];
    
    [toolbar setItems:[NSArray arrayWithObjects:infoButton,nil]];
    
    //Add the toolbar as a subview to the navigation controller.
    [self.navigationController.view addSubview:toolbar];
    
    //Reload the table view
    [self.tableView reloadData]; 
    }
      
  4. В конечном итоге это приводит к следующему экрану (как я бы хотел):
    Просмотреть макет текущего результата на iOS

Проблема: Моя проблема сейчас в том, что я могу нажать ТОЛЬКО на кнопку Обновить. Нельзя нажать на две другие кнопки (Информация и Выход). И я не понимаю, почему? Что я здесь делаю не так?

Мы искренне признательны за вашу помощь!

Ответ №1:

Попробуйте автоматически удалить вторые две кнопки, как и первую (обновить).

 UIBarButtonItem *myLogoutButton = [[[UIBarButtonItem alloc] initWithTitle:@"Logout" style:UIBarButtonSystemItemCancel target:self action:@selector(logout)]autorelease];



UIBarButtonItem *infoButton = [[[UIBarButtonItem alloc] 
                             initWithTitle:@"Info" style:UIBarButtonItemStyleBordered target:self action:@selector(info_clicked:)]autorelease];
  

Комментарии:

1. Спасибо за ваш ответ, но это решение не решило проблему)-: Я пробовал оба способа: UIBarButtonItem *myLogoutButton = [[[UIBarButtonItem alloc] initWithTitle:@"Logout" style:UIBarButtonSystemItemCancel target:self action:@selector(logout)] autorelease]; и [myLogoutButton release];

Ответ №2:

Люди, я нашел причину своей проблемы, и я должен сказать, что это было очень, очень глупо.

Первая строка этого проекта отвечала за все трубы:

 UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 400)];
  

Поскольку созданное мной представление имеет размер всего 200×400, оно слишком мало для распознавания любых событий, которые появляются за пределами этого представления (хотя все видно).

Если я изменю размер этого представления, все будет работать так, как ожидалось:

 UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 500)];
  

Но более динамичным решением, вероятно, было бы:

 CGRect cgRect =[[UIScreen mainScreen] bounds];
CGSize cgSize = cgRect.size;
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, cgSize.width, cgSize.height)];
  

Может быть, есть еще лучшее решение для получения динамического размера экрана?