Есть ли лучший способ сделать следующее в приложении Xcode для iPhone?Создание кнопок в Xcode
У меня есть главный экран навигации UIViewController с 4 кнопками на нем.
Нажатие кнопки 1 показывает навигационную систему UIViewController с 4 кнопками на ней. Нажатие кнопки 2 показывает ту же навигационную систему UIViewController, но с 5 кнопками на ней. Нажатие кнопки 3 показывает ту же навигационную систему UIViewController, но с 4 кнопками на ней. Нажатие кнопки 4 показывает ту же навигационную систему UIViewController, но с 6 кнопками на ней.
Для этого я назначил метки каждой кнопке в основной навигации. Когда нажата кнопка, я беру этот номер тега и передаю его на суб-навигацию UIViewController.
Затем в подвигаторе UIViewController, основываясь на этом значении, я вручную рисую/создаю вспомогательные кнопки навигации по мере необходимости.
Ниже приведено описание того, как я обрабатываю это в навигационной системе UIViewController. Я проверяю, какое значение было передано из основной навигации UIViewController, и нарисуйте количество кнопок соответственно. Я также устанавливаю пользовательские фоновые изображения для каждой кнопки. И для каждого нажатия кнопки у меня есть свой собственный метод выбора. Обратите внимание, что некоторые кнопки в субнавигации перейдут на UIViewController, а некоторые кнопки перейдут в TableViewController. Также каждая кнопка суб-навигации должна отображать свое собственное «содержимое» в своем представлении назначения.
Есть ли лучший, более элегантный способ обращения с этим? Мне просто кажется, что для меня много дублирования кода. Пример ниже сокращен для краткости.
// SubNavViewController.m
// SegueTest
#import "SubNavViewController.h"
#import "GettingHereViewController.h"
#import "TableViewController.h"
#import "GettingHereContent.h"
@interface SubNavViewController()
@end
@implementation SubNavViewController
@synthesize tagNumber;
@synthesize buttonNumber;
@synthesize buttonPushedTrackNumber;
@synthesize hotelButton;
@synthesize bAndBButton;
@synthesize caravanButton;
@synthesize selfCateringButton;
@synthesize apartmentsButton;
.
.
.
etc (19 in total)
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
if (self.tagNumber == 1)
{
self.navigationItem.title = @"Getting Here";
// By Air Button
byAirButton = [UIButton buttonWithType:UIButtonTypeCustom];
byAirButton.tag = 1;
byAirButton.frame = CGRectMake(25, 140, 280.f, 40.f);
UIImage *airButton = [UIImage imageNamed:@"gettingHereByAirButton.png"];
[byAirButton setBackgroundImage:airButton forState:UIControlStateNormal];
[self.view addSubview:byAirButton];
[byAirButton addTarget:self action:@selector(byAirButtonClicked) forControlEvents:UIControlEventTouchUpInside];
// By Rail Button
byRailButton = [UIButton buttonWithType:UIButtonTypeCustom];
byRailButton.tag = 2;
byRailButton.frame = CGRectMake(25, 190, 280.f, 40.f);
UIImage *railButton = [UIImage imageNamed:@"gettingHereByRailButton.png"];
[byRailButton setBackgroundImage:railButton forState:UIControlStateNormal];
[self.view addSubview:byRailButton];
[byRailButton addTarget:self action:@selector(byRailButtonClicked) forControlEvents:UIControlEventTouchUpInside];
.
.
. etc (2 more button)
}
else if (self.tagNumber == 2)
{
self.navigationItem.title = @"Where to Stay";
// B&B Button
bAndBButton = [UIButton buttonWithType:UIButtonTypeCustom];
bAndBButton.tag = 1;
bAndBButton.frame = CGRectMake(25, 140, 280.f, 40.f);
UIImage *bedAndBreakfast = [UIImage imageNamed:@"whereToStayBedAndBreakfastButton.png"];
[bAndBButton setBackgroundImage:bedAndBreakfast forState:UIControlStateNormal];
[self.view addSubview:bAndBButton];
[bAndBButton addTarget:self action:@selector(bAndBButtonClicked) forControlEvents:UIControlEventTouchUpInside];
.
.
. etc (do this for the rest of the buttons)
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
- (void) byAirButtonClicked
{
GettingHereContent *gettingHere = [GettingHereContent new];
gettingHere = @"By Air";
NSLog(@"Content: %@", gettingHere);
[self performSegueWithIdentifier:@"gettingHereSegue" sender:self];
}
- (void) bAndBButtonClicked
{
GettingHereContent *gettingHere = [GettingHereContent new];
gettingHere = @"Bed and Breakfast";
NSLog(@"Content: %@", gettingHere);
[self performSegueWithIdentifier:@"tableViewSegue" sender:self];
}
.
.
. (do this for all buttons - 19 in total)
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
}
@end
Насколько это может быть упрощена, зависит от того, есть ли какой-либо перекрытие в ваших 4 суб контроллерах зрения навигации. У некоторых из них есть те же кнопки, что и некоторые другие? Некоторые из кнопок переходят к тем же контроллерам, или все они разные? Одна вещь, которую вы можете упростить, - удалить все операторы @synthesize, они больше не нужны. – rdelmar
Все кнопки будут отличаться, но большинство из них перейдет к одному контроллеру. Только 4 кнопки перейдут на другой контроллер. Кроме того, я попробовал удалить все операторы @synthesize, но получил массу ошибок, поэтому оставит их сейчас. – heyred
Вероятно, вы получили эти ошибки, потому что вы ссылаетесь на свои свойства как на hotelButton, например - вам нужно использовать self.hotelButton, если вы получаете доступ к собственности, или _hotelButton, если вы хотите получить доступ к прямому ivar напрямую. – rdelmar