有沒有更好的方法在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
這可以簡化多少取決於您的4個子導航視圖控制器是否有任何重疊。他們中的一些人與其他人有相同的按鈕嗎?是否有一些按鈕延續到相同的控制器,還是它們都不一樣?你可以簡化的一件事是刪除所有的@synthesize語句,它們不再需要。 – rdelmar
所有按鈕都會有所不同,但其中大多數會繼續使用相同的控制器。只有4個按鈕會延續到不同的控制器。此外,我試圖刪除所有的@synthesize語句,但得到了一個錯誤的負載,所以現在就離開他們。 – heyred
您可能得到了這些錯誤,因爲您指的是酒店按鈕的屬性,例如 - 您需要使用自我。hotelButton如果你正在訪問該屬性,或_hotelButton,如果你想直接訪問後援伊娃。 – rdelmar