#objective-c #uibarbuttonitem #clickable
#objective-c #uibarbuttonitem #доступен для кликабельности
Вопрос:
У меня очень сложная проблема, и после долгих поисков (Google, stackoverflow, …) я не нашел решения, которое работает для меня.
Позвольте мне представить вам мою текущую выбранную архитектуру:
-
У меня есть 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; }
-
В моем 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; }
-
В моем 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]; }
-
В конечном итоге это приводит к следующему экрану (как я бы хотел):
Просмотреть макет текущего результата на 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)];
Может быть, есть еще лучшее решение для получения динамического размера экрана?