0

UITabBar と UITableViews が設定された GUI を取得しようとしています。

プログラムで作成された UITabView があります。タブの 1 つは、同じくプログラムで作成された UITableView を表示します。

この UITableView は、 didSelectRowAtIndexPath が呼び出されたときに他のビューを表示します。

残念ながら、テーブル セルをクリックすると、タブ ビューが消えて、新しいテーブル ビューが表示されます。

私が理解できないのは、タブバーが画面にとどまるようにビューを構造化する方法です。

UITableViewsを短くするのと同じくらい簡単ですか、それとも私が見逃しているウィンドウ/ビューのモジョがありますか?

ありがとう

4

2 に答える 2

4

UITabBar を表示するには、直接表示するのではなく、UITabBarController を使用する必要があります。

次に、特定のタブのビュー コントローラーとして UITableViewController を使用します。行が選択されたときに子孫の UITableViews を提示したいという印象を受けますが。この場合、UINavigationController をタブ バーのビュー コントローラーとして使用し、UITableViewControllers を管理する必要があります。

iOS では、実際にはビュー コントローラー パターンを使用する必要があることに注意してください。フレームワークが内部で多くの処理を行います。


ファローアップ:

OK、次の簡単な実装は私にとってはうまく機能します。このコードの多くの明らかな問題は無視してください (アプリケーション デリゲートでまとめてハッキングしたという事実から始まります!)。これは純粋に、コントローラーを接着する方法のモデルとして意図されています。

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate, UITableViewDelegate, UITableViewDataSource>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) UINavigationController *navController;

@end




@implementation AppDelegate

@synthesize window = _window;
@synthesize navController = _navController;

- (void)dealloc
{
    [_navController release];
    [_window release];
    [super dealloc];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    UITableViewController *rootTVC = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
    [[rootTVC tableView] setDelegate:self];
    [[rootTVC tableView] setDataSource:self];
    [rootTVC setTitle:@"Root Table"];

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:rootTVC];
    [rootTVC release];
    [navController setTitle:@"My Table"];

    UIViewController *anotherViewController = [[UIViewController alloc] init];
    [anotherViewController setTitle:@"Not the table"];

    UITabBarController *tbc = [[UITabBarController alloc] init];
    [tbc setViewControllers:[NSArray arrayWithObjects:navController, anotherViewController, nil]];
    [self setNavController:navController];
    [navController release];
    [anotherViewController release];
    [[self window] setRootViewController:tbc];
    [tbc release];

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 10;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *reuseIdentifier = @"foo";
    UITableViewCell *cell = [[tableView dequeueReusableCellWithIdentifier:reuseIdentifier] retain];
    if (! cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
    }
    [[cell textLabel] setText:[NSString stringWithFormat:@"Row %d", [indexPath row]]];
    return [cell autorelease];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    UITableViewController *newTVC = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
    [newTVC setTitle:[NSString stringWithFormat:@"Table %d", [indexPath row]]];
    [[newTVC tableView] setDelegate:self];
    [[newTVC tableView] setDataSource:self];
    [[self navController] pushViewController:newTVC animated:YES];
}

@end
于 2012-04-05T22:53:10.887 に答える
0

UITabBar の代わりに UITabBarController を使用します。

于 2012-04-05T22:56:40.337 に答える