1

最初にアプリを作成していUITableViewますが、初めてスマートフォンでアプリを作成して実行すると、何もUITableView表示されません。実行を停止してから再構築して再度実行すると、すべてのデータが表示されます。また、アプリがすでに私の電話にある場合、それは正常に構築され、実行されます。これは最初の最初のビルドであり、電話にアプリを「インストール」してUITableView空のままにしたときに実行されます。彼らが私のアプリをレビューするときに、これがアップルに問題を引き起こすかどうか知りたいですか?そして、これを実現するために私が間違っていることはありますか?

注:はUITableView、ドキュメントディレクトリに移動されているplistから入力されています。私の当初の考えはUITableView、plistがドキュメントディレクトリに正常に移動される前に、がリストにデータを入力しようとしているというものでした。[self.tableView reloadData];そのため、メソッドの最後で呼び出しようとしましたviewDidLoadが、同じ結果が得られました。

@implementation AppDelegate

- (void)createEditableCopyOfDatabaseIfNeeded
{
    //TESTING FOR EXISTENCE
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [searchPaths lastObject];
    NSString *writeableDBPath = [documentsDirectory stringByAppendingPathComponent:@"ScotchList.plist"];

    BOOL dbexists = [fileManager fileExistsAtPath:writeableDBPath];
    if (!dbexists) {
        // The writeable database does not exist, so copy the default to the appropriate location.
        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"ScotchList.plist"];

        NSError *error;
        BOOL success = [fileManager copyItemAtPath:defaultDBPath toPath:writeableDBPath error:&error];
        if (!success) {
            NSAssert1(0, @"Failed to create writeable database file with message '%@'.", [error localizedDescription]);
        }
    }
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController_iPhone" bundle:nil];
        self.navigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController];

        self.window.rootViewController = self.navigationController;
    } else {
        MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController_iPad" bundle:nil];
        UINavigationController *masterNavigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController];

        DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController_iPad" bundle:nil];
        UINavigationController *detailNavigationController = [[UINavigationController alloc] initWithRootViewController:detailViewController];

        masterViewController.detailViewController = detailViewController;

        self.splitViewController = [[UISplitViewController alloc] init];
        self.splitViewController.delegate = detailViewController;
        self.splitViewController.viewControllers = @[masterNavigationController, detailNavigationController];

        self.window.rootViewController = self.splitViewController;
    }
    [self.window makeKeyAndVisible];
    [self createEditableCopyOfDatabaseIfNeeded];
    [application setStatusBarStyle:UIStatusBarStyleBlackOpaque];
    return YES;
}

MasterViewController.m

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.sections = [[NSMutableDictionary alloc] init];
    BOOL found;

    // Loop through the whiskys and create our keys
    for (NSMutableDictionary *whisky in self.drinks)
    {
        NSString *c = [[whisky objectForKey:NAME_KEY] substringToIndex:1];

        found = NO;

        for (NSString *str in [self.sections allKeys])
        {
            if ([str isEqualToString:c])
            {
                found = YES;
            }
        }

        if (!found)
        {
            [self.sections setValue:[[NSMutableArray alloc] init] forKey:c];
        }
    }
    // Loop again and sort the whiskys into their respective keys
    for (NSMutableDictionary *whisky in self.drinks)
    {
        [[self.sections objectForKey:[[whisky objectForKey:NAME_KEY] substringToIndex:1]] addObject:whisky];
    }
    // Sort each section array
    for (NSString *key in [self.sections allKeys])
    {
        [[self.sections objectForKey:key] sortUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:NAME_KEY ascending:YES]]];
    }
        [self.tableView reloadData];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.582d0e
    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
    self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0x015/255.0 green:0x04/255.0 blue:0x04/255.0 alpha:1];
    self.tableView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"cellBackground.png"]];
    self.navigationItem.leftBarButtonItem = self.editButtonItem;
    self.navigationItem.leftBarButtonItem.tintColor = [UIColor redColor];
    self.navigationItem.backBarButtonItem.tintColor = [UIColor colorWithRed:0x3e/255.0 green:0x3e/255.0 blue:0x3e/255.0 alpha:1];
    UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];
    self.navigationItem.rightBarButtonItem = addButton;
    self.navigationItem.rightBarButtonItem.tintColor = [UIColor colorWithRed:0x015/255.0 green:0x04/255.0 blue:0x04/255.0 alpha:1];

    UIImage *titleImage = [UIImage imageNamed:@"whiskeyTitle.png"];
    self.navigationItem.titleView = [[UIImageView alloc]initWithImage:titleImage];

    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [searchPaths lastObject];
    NSString *writeableDBPath = [documentsDirectory stringByAppendingPathComponent:@"ScotchList.plist"];

    NSMutableArray *tmpArray = [[NSMutableArray alloc]initWithContentsOfFile:writeableDBPath];

    self.drinks = tmpArray;
    deletedDrink = [[NSMutableArray alloc]init];
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(applicationDidEnterBackground:) 
                                                 name:UIApplicationDidEnterBackgroundNotification
                                               object:nil];

    //Register for application exiting information so we can save data
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:nil];

    bookCover = [[UIImageView alloc]init];
    bookCover.image = [UIImage imageNamed:@"Default.png"];
    openBookButton = [[UIButton alloc]init];
    [openBookButton addTarget:self action:@selector(goToPage:flipUp:) forControlEvents:UIControlEventTouchUpInside];
    bookCover.frame = CGRectMake(0, 0, 320, 480);
    openBookButton.frame = bookCover.frame;

    [self.navigationController.view addSubview:bookCover];
    [self.navigationController.view addSubview:openBookButton];
    [self.tableView reloadData];
}

OKアップデート

私は、アプリが最初に構築され、電話で実行(インストール)さNSLog()れたときに、plistからプルする配列をviewDidLoadログに記録しました。停止して再構築して実行すると、plistからの情報が返されます(nullではありません)。

4

2 に答える 2

1

とった。基本的に、()には、ドキュメントディレクトリ内のデータベース(私の場合はplist)をチェックするメソッドがappDelegate.mありcreateEditableCopyOfDatabaseIfNeededます。既存のplistがすでに存在する場合、それは上書きされません。plistがない場合は、アプリに付属しているplistをdocumentsディレクトリに移動します。それからapplicationDidFinishLaunchingWithOptions:私が呼んだメソッドの中で、[self createEditableCopyOfDatabaseIfNeeded];それはすべて良いはずだと思われます。ただし、メソッド内には、ifの後に呼び出しapplicationDidFinishLaunchingWithOptionsていたIをチェックするifステートメントと、interfaceIdiomをチェックするelseがあります。私は単にifステートメントに移動しました。ここで、はiPhoneです。currentDevice userInterfaceIdiom[self createEditableCopyOfDatabaseIfNeeded];userInterfaceIdiom

以下に、問題がどこにあり、それを解決するためにどこに移動したかについてコメントしました。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController_iPhone" bundle:nil];
        self.navigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController];

        self.window.rootViewController = self.navigationController;

        //THIS WAS THE SOLUTION RIGHT BELOW.
        [self createEditableCopyOfDatabaseIfNeeded];
    } else {
        MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController_iPad" bundle:nil];
        UINavigationController *masterNavigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController];

        DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController_iPad" bundle:nil];
        UINavigationController *detailNavigationController = [[UINavigationController alloc] initWithRootViewController:detailViewController];

        masterViewController.detailViewController = detailViewController;

        self.splitViewController = [[UISplitViewController alloc] init];
        self.splitViewController.delegate = detailViewController;
        self.splitViewController.viewControllers = @[masterNavigationController, detailNavigationController];

        self.window.rootViewController = self.splitViewController;
    }
    [self.window makeKeyAndVisible];
    //THIS IS WHERE [self createEditableCopyOfDatabaseIfNeeded]; WAS ORIGINALLY WHICH WAS CAUSING THE PROBLEM
    [application setStatusBarStyle:UIStatusBarStyleBlackOpaque];
    return YES;
}
于 2012-07-12T18:25:34.780 に答える
0

plistファイルがロードされ、最初のロードでアクセス可能であることを確認します。次のようなものを試してください。

NSFileManager *filemgr;

filemgr = [NSFileManager defaultManager];

if ([filemgr fileExistsAtPath: @"/CacheDirectory/DocumentDirectory/TempDirectory/myfile.txt" ] == YES)
        NSLog (@"File exists");
else
        NSLog (@"File not found");

念のため。存在する場合は、データをログに記録して、初めて起動する前にデータが完全に入力されているかどうか、またはアプリが完全に電話に出る前にファイルを開いているかどうかを確認してください。シミュレーターで起動すると、アプリは可能な限り早く起動し、スレッドの切り替えなどが発生して、アプリがファイルからストリームを開く前にファイルの書き込みが完全に完了しない可能性があります...アプリをインストールするとすぐに起動しないため、ユーザーのiPhoneにインストールしても問題は発生しないと思います。

とにかく、iPhoneを持っていてFacebookアプリを使用している人は、アプリを開いたときに何も表示されないことがあり、アプリを再起動します... ;-)

于 2012-07-12T17:19:57.133 に答える