2013-11-02 3 views
1

Есть ли лучший способ сделать следующее в приложении 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 
+0

Насколько это может быть упрощена, зависит от того, есть ли какой-либо перекрытие в ваших 4 суб контроллерах зрения навигации. У некоторых из них есть те же кнопки, что и некоторые другие? Некоторые из кнопок переходят к тем же контроллерам, или все они разные? Одна вещь, которую вы можете упростить, - удалить все операторы @synthesize, они больше не нужны. – rdelmar

+0

Все кнопки будут отличаться, но большинство из них перейдет к одному контроллеру. Только 4 кнопки перейдут на другой контроллер. Кроме того, я попробовал удалить все операторы @synthesize, но получил массу ошибок, поэтому оставит их сейчас. – heyred

+0

Вероятно, вы получили эти ошибки, потому что вы ссылаетесь на свои свойства как на hotelButton, например - вам нужно использовать self.hotelButton, если вы получаете доступ к собственности, или _hotelButton, если вы хотите получить доступ к прямому ivar напрямую. – rdelmar

ответ

1

Сначала я бы рекомендовал создать NS_ENUM определить все ваши кнопки следующим образом:

typedef NS_ENUM(NSUInteger, ButtonTag) 
{ 
    ButtonTagHotel, 
    ButtonTagOther, 
    ... 
} 

Тогда в viewDidLoad: вы можете создать массив со всеми кнопками, которые необходимы для тока состояние как следующим образом:

NSMutableArray *buttonTags = [[NSMutableArray alloc] init]; 

if (self.tagNumber == 1 || self.tagNumber == 3) 
    [buttonTags addObject: @(ButtonTagHotel)]; 

if (self.tagNumber == 5 || self.tagNumber == 8) 
    [buttonTags addObject: @(ButtonTagOther)]; 

// etc... 

Когда вы создать свой необходимые теги кнопки, вы можете создать и добавить их все в одном цикле:

uint cnt = 0; 

for (NSNumber *tag in buttonTags) 
{ 
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; 
    btn.tag = [tag unsignedIntValue]; 
    btn.frame = CGRectMake(25, 20 + (cnt * 50.f), 280.f, 40.f); 
    UIImage *image = [UIImage imageNamed:@"genericButtonImage.png"]; 
    [btn setBackgroundImage:image forState:UIControlStateNormal]; 
    [self.view addSubview:btn]; 
    [btn addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside]; 

    cnt++; 
} 

Если вы должны установить различные изображения для каждой кнопки, то вы должны создать другой массив, который держит все имена изображений индексированных перечислений ButtonTag ...

Теперь вы просто должны реализовывать - (недействительными) buttonTouched: (UIButton *) отправитель:

-(void)buttonTouched:(UIButton*)sender 
{ 
    switch (sender.tag) { 
     case ButtonTagHotel: 
     { 
      // do your stuff 
     } 
      break; 
     ... 
     default: 
      break; 
    } 
} 
Смежные вопросы