2013-11-02 78 views
1

有沒有更好的方法在Xcode for 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如果你正在訪問該屬性,或_hotelButton,如果你想直接訪問後援伊娃。 – 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枚舉索引的所有圖像名稱另一個數組...

現在你只需要實現 - ( void)buttonTouched:(UIButton *)發件人:

-(void)buttonTouched:(UIButton*)sender 
{ 
    switch (sender.tag) { 
     case ButtonTagHotel: 
     { 
      // do your stuff 
     } 
      break; 
     ... 
     default: 
      break; 
    } 
}