1

以前に単純なココア タッチ アプリを作成したことがありますが、UINavigationControllers を使用したことはありません。アドバイスをいただければ幸いです。

店舗名のリストの配列を UITableView に追加しようとしています。UITableView は、タブ バーのタブから UINavigation コントローラーを介してアクセスされます。

タブバーを保持する TabBarController.xib ファイルがあります。UINavigationController を保持する AtoZNavigationController.xib もあります。そして、UITableView を保持する AtoZTableController.xib ファイルがあります。

これは私の AppDelegate.h です:

#import <UIKit/UIKit.h>
@class AtoZNavigationController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) IBOutlet UITabBarController *rootController;
@property (strong, nonatomic) IBOutlet AtoZNavigationController *navController;

@end

AppDelegate.m

#import "AppDelegate.h"
#import "AtoZNavigationController.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize rootController;
@synthesize navController;

#pragma mark -
#pragma mark Application lifecycle

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:       (NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.

[[NSBundle mainBundle] loadNibNamed:@"TabBarController" owner:self options:nil];
  [self.window addSubview:rootController.view];
  self.window.backgroundColor = [UIColor whiteColor];
  [self.window makeKeyAndVisible];

return YES;
}
@end

AtoZNavigationController.h

#import <UIKit/UIKit.h>

@interface AtoZNavigationController : UINavigationController

@end

AtoZNavigationController.m

#import "AtoZNavigationController.h"

@interface AtoZNavigationController ()

@end

@implementation AtoZNavigationController

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

-(void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

-(void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

AtoZTableController.h

#import <UIKit/UIKit.h>

@interface AtoZTableController : UITableViewController <UITableViewDelegate,       UITableViewDataSource>
{
    IBOutlet UITableView *AtoZTableView;
    NSMutableArray *AtoZArray;
}

@property (nonatomic, retain) IBOutlet UITableView *AtoZTableView;
@end

AtoZTableController.h

#import "AtoZTableController.h"

@interface AtoZTableController ()

@end

@implementation AtoZTableController
@synthesize AtoZTableView;

-(id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

 -(void)viewDidLoad
 {
     [super viewDidLoad];

     self.title = NSLocalizedString(@"A to Z", @"An A to Z List of Stores");

     AtoZArray = [[NSMutableArray alloc] init];

    [AtoZArray addObject:@"Apple"];
    [AtoZArray addObject:@"Boots"];
    [AtoZArray addObject:@"Topman"];
}

 -(void)viewDidUnload
{
     [super viewDidUnload];
     // Release any retained subviews of the main view.
     // e.g. self.myOutlet = nil;
}

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 0;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [AtoZArray count];
}

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...

    NSInteger row = [indexPath row];
    cell.textLabel.text = [AtoZArray objectAtIndex:row];
    return cell;
}
#pragma mark - Table view delegate

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
    /*
     <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
     [self.navigationController pushViewController:detailViewController animated:YES];
     */
}
@end
4

2 に答える 2

2

に問題がありますAtoZTableController.h

問題は、'tableView:cellForRowAtIndexPath:' メソッドにあります。ここにあなたが持っているものがあります:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...

    NSInteger row = [indexPath row];
    cell.textLabel.text = [AtoZArray objectAtIndex:row];
    return cell;
}

nil問題は、 fromの戻り値を決して処理しないことですdequeueReusableCellWithIdentifier:CellIdentifier

これを試してください:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // What happens if you don't get a cell to use?
    // This is the way to create a new, default UITableViewCell
    if (!cell) {            
        // You can look at the UITableViewCell class reference to see the 4 available styles
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    NSInteger row = [indexPath row];
    cell.textLabel.text = [AtoZArray objectAtIndex:row];
    return cell;
}

編集/更新:

エラーがどこにあるかを正確に知るのは少し難しいので、典型的な状況 (または、あなたの立場でそれを行う方法) を設定/説明します。

新しいアプリを作成し、Xcode で「タブ付きアプリケーション」テンプレートを選択すると、アプリ デリゲートで次のメソッドが得られます (多かれ少なかれ、少し要約して、ドット表記を使用する Apple の不適切な選択を「修正」しました)。

注:新しいビュー コントローラーをプッシュする際に発生している問題は、以下で修正されると思います

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [self setWindow:[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]];
    // Override point for customization after application launch.
    UIViewController *vc1 = [[FirstViewController alloc] initWithNibName:@"FirstVC" bundle:nil];
    // New line...
    UINavigationController *navC = [[UINavigationController alloc] initWithRootViewController:vc1];
    UIViewController *vc2 = [[SecondViewController alloc] initWithNibName:@"SecondVC" bundle:nil];
    [[self setTabBarController:[[UITabBarController alloc] init]];
    // Change here, too...
    [[self tabBarController] setViewControllers:[NSArray arrayWithObjects:navC, vc2, nil]];
    [[self window] setRootViewController:[self tabBarController]];
    [[self window] makeKeyAndVisible];
    return YES;
}

このメソッドは、2 つの UIViewControllers を作成し、UITabBarController 内でタブ 1 とタブ 2 として設定して、アプリを起動するために必要なすべてをセットアップします。

これで、FirstViewController と SecondViewController を好きなように作成できます。この質問のために、FirstViewController を変更して UITableView をホストすると仮定します。これにより、ユーザーが画面上の行を選択したときに詳細な UIViewController がプッシュされます。

要件 FirstViewControllerは UITableViewController のサブクラスである必要があります (これは既定のテンプレートが提供するものではありません)。または、UITableView を FirstViewController のビューに追加し、すべての接続を設定する必要があります。

FirstViewController を標準の UIViewController サブクラスとして保持し、そのビューに UITableView を追加するとします。(おそらく UITableViewController サブクラスに変更しますが、この時点ではさらに混乱する可能性があります。)

まず、FirstViewController.h で、これを変更します。

@interface MMFirstViewController : UIViewController 
@end

これに:

@interface MMFirstViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> {
    UITableView *TableView;
}
@property (strong, nonatomic) IBOutlet UITableView *TableView;
@end

次に、FirstViewController.m で、TableView プロパティを合成します ( @synthesize TableView)。次に、Xcode で FirstViewController.xib をクリックして、Interface Builder にロードします (ここでは、Xcode 4 を使用していると想定しています)。次に、UITableView をコントロール パネルから UIViewController のビューにドラッグします。Interface Builder で次の接続を行います。

  1. 右クリックしFile's Ownerて、TableView プロパティを FirstViewController のビューにドロップした UITableView に接続します。
  2. UITableView を右クリックし、両方datasource AND delegateプロパティを に接続しFile's Ownerます。

これで、初期化と入力を投稿したコードが正常にAtoZArray機能するはずです。numberOfSectionsInTableView:以前に持っていた 、 、tableView:numberOfRowsInSection:およびの 3 つの UITableView メソッドをコピーすることを忘れないでくださいtableView:cellForRowAtIndexPath:

これらの手順により、作業が開始され、セットアップのどこで問題が発生した可能性があるかがわかります。tableView:didSelectRowAtIndexPath:新しい UIViewController をプッシュするには、自分で解決する 必要があることに注意してください。

開始するためのティーザーは次のとおりです。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
    ThirdViewController *detailVC = [[ThirdViewController alloc] initWithNibName:@"ThirdViewController" bundle:nil];
    [[self navigationController] pushViewController:detailVC animated:YES];
}
于 2012-04-29T20:51:29.097 に答える
1

navigationController のインスタンスを作成し、それを appDelegate.m のサブビューに tabBarController と共に渡す必要がありました。その後、UITableViewController で参照できます。

追加したコードは次のとおりです。

navigationController = [[UINavigationController alloc] initWithRootViewController:_tabBarController];
[self.window addSubview:_tabBarController.view];
[self.window addSubview:navigationController.view];
[self.window makeKeyAndVisible]; 

ここで、navigationController は、表示する画面のタイプに応じて、UITableViewController または UIViewController のサブクラスの単なるインスタンスです。

于 2012-05-03T17:46:10.307 に答える