3

ストーリーボードと XCode 4.3 を使用して、ルート ビューとしてタブ バーを持つアプリを作成しています。私のアプリには正常に動作する他のセグエがありますが、そのうちの 1 つがトリガーされません。タブの 3 番目の項目が選択されたときにトリガーされるはずです。私が見ることができる唯一のことは、タブ バーが実際に新しいビューをロードすることですが、情報は渡されません。

ストーリーボードの接続は次のとおりです: ルート ビュー コントローラー (タブ バー) -> ナビゲーション コントローラー -> CapitolDetailViewController (別のビュー コントローラーからのプッシュ セグエがあります)

接続、コードなどで多くの変更を試みましたが、このセグエをトリガーしません。AppDelegate のコードを変更して、欠落していた新しいコントローラーを追加しようとしました。私の applicationDidFinishLaunching のコードは次のとおりです。

NSManagedObjectContext *context = [self managedObjectContext];


NSError *error;
if (![context save:&error]) {
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}

    tabBarController = (UITabBarController *)self.window.rootViewController;


    UINavigationController *view1 = [[tabBarController viewControllers]    objectAtIndex:0];
    UINavigationController *view2 = [[tabBarController viewControllers] objectAtIndex:1];
    UINavigationController *view3 = [[tabBarController viewControllers] objectAtIndex:2];

    SCDMasterViewController *view11 = [[view1 viewControllers] objectAtIndex:0];
    view11.managedObjectContext = self.managedObjectContext;    

    SerieDetailViewController *view22 = [[view2 viewControllers] objectAtIndex:0];

    CapitolDetailViewController *view33 = [[view3 viewControllers] objectAtIndex:0];


    return YES;

ここで、「SerieDetailViewController」は 3 番目のアイテムが選択されたときに情報を渡す必要があるものであり、「CapitolDetailViewController」はそれを受け取る必要があるものです。

私のセグエのコード: (セグエに入ることさえありません。de NSLOG は表示されません)

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {


    NSLog(@"Entra segue");


    if ([segue.identifier isEqualToString:@"mostraCapitol"]) {



        NSString *nom = @"";

        nom= serieName;

        CapitolDetailViewController *destViewController = segue.destinationViewController;

        destViewController.serieName2 = nom; 

    }
}

誰が何が悪いのか知っていますか?

更新:コンパイルエラーを修正するのに役立つ回答を受け取りましたが、問題はまだあります。タブ バーの項目をクリックすると、空のビューが読み込まれます。セグエを呼び出すことはありません。タブバーのアイテムとView Controllerがアタッチされていないようです。

4

3 に答える 3

2

動作しないセグエメソッドを確認してみてください。ストーリーボードのセグエの識別子がクラスのものと一致することを確認してください。コードとすべてのコメントの外観から、コードは問題なく動作するはずです。問題が発生する唯一の場所は、ストーリーボードのセグエの異なる識別子です。これで問題が解決することを願っています。

編集:

これがうまくいくかどうかはわかりませんが、タブバーアプリでコアデータを設定する方法が異なります。デリゲートの .h ファイルでは、ほとんどすべてが一般的です。特に .m では、applicationdidfinishwithoptionタブ バーに追加するビュー コントローラーでビューを並べ替えるためにインデックス番号を使用します。これが役立つことを願っています。これが私が使用するコードです。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self setupFetchedResultsController];

if (![[self.fetchedResultsController fetchedObjects] count] > 0 ) {
NSLog(@"!!!!! ~~> There's nothing in the database so defaults will be inserted");
[self importCoreDataDefaultRoles];
}
else {
NSLog(@"There's stuff in the database so skipping the import of default data");    
}

// The Tab Bar
UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;

// The Two Navigation Controllers attached to the Tab Bar (At Tab Bar Indexes 0 and 1)
 UINavigationController *view1 = [[tabBarController viewControllers] objectAtIndex:0];
UINavigationController *view2 = [[tabBarController viewControllers] objectAtIndex:1];

View1 *view1 = [[view1nav viewControllers] objectAtIndex:0];
personsTVC.managedObjectContext = self.managedObjectContext;    

View2 *view2 = [[view2nav viewControllers] objectAtIndex:0];
rolesTVC.managedObjectContext = self.managedObjectContext;

return YES;
}

インデックス番号を使用することで、エラーなしで同じシナリオを実現できました。起動ビューには、最初のモーダル ビューとしてプラグインした子を使用しました。これがお役に立てば幸いです。私の場合、コアデータを複数のタブに追加する必要がありましたが、同じ必要があるかどうかはわかりません。

編集1

これが私のAppdelegate.h

#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator   *persistentStoreCoordinator;
@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

@end

そしてここにapp delegate.m

#import "AppDelegate.h"

#import "PersonsTVC.h"
#import "RolesTVC.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize managedObjectContext = __managedObjectContext;
@synthesize managedObjectModel = __managedObjectModel;
@synthesize persistentStoreCoordinator = __persistentStoreCoordinator;
@synthesize fetchedResultsController = __fetchedResultsController;

- (void)insertRoleWithRoleName:(NSString *)roleName
{
Role *role = [NSEntityDescription insertNewObjectForEntityForName:@"Role"
                                              inManagedObjectContext:self.managedObjectContext];

role.name = roleName;

[self.managedObjectContext save:nil];
}

- (void)importCoreDataDefaultRoles {

NSLog(@"Importing Core Data Default Values for Roles...");
[self insertRoleWithRoleName:@"Player 1"];
[self insertRoleWithRoleName:@"Player 2"];
[self insertRoleWithRoleName:@"Player 3"];
[self insertRoleWithRoleName:@"Player 4"];
[self insertRoleWithRoleName:@"Player 5"];
[self insertRoleWithRoleName:@"Player 6"];
[self insertRoleWithRoleName:@"Player 7"];
[self insertRoleWithRoleName:@"Player 8"];
[self insertRoleWithRoleName:@"Player 9"];
[self insertRoleWithRoleName:@"Player 10"];
[self insertRoleWithRoleName:@"Player 11"];
[self insertRoleWithRoleName:@"Player 12"];
NSLog(@"Importing Core Data Default Values for Roles Completed!");
}
- (void)setupFetchedResultsController
{
// 1 - Decide what Entity you want
NSString *entityName = @"Role"; // Put your entity name here
NSLog(@"Setting up a Fetched Results Controller for the Entity named %@", entityName);

// 2 - Request that Entity
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];

// 3 - Filter it if you want
//request.predicate = [NSPredicate predicateWithFormat:@"Person.name = Blah"];

// 4 - Sort it if you want
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor   sortDescriptorWithKey:@"name"
                                                                             ascending:YES
                                                                                selector:@selector(localizedCaseInsensitiveCompare:)]];
// 5 - Fetch it
self.fetchedResultsController = [[NSFetchedResultsController alloc]    initWithFetchRequest:request
                                                                  managedObjectContext:self.managedObjectContext
                                                                  sectionNameKeyPath:nil
                                                                           cacheName:nil];
[self.fetchedResultsController performFetch:nil];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self setupFetchedResultsController];

if (![[self.fetchedResultsController fetchedObjects] count] > 0 ) {
NSLog(@"!!!!! ~~> There's nothing in the database so defaults will be inserted");
[self importCoreDataDefaultRoles];
}
else {
NSLog(@"There's stuff in the database so skipping the import of default data");    
}

// The Tab Bar
UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;

// The Two Navigation Controllers attached to the Tab Bar (At Tab Bar Indexes 0 and 1)
UINavigationController *personsTVCnav = [[tabBarController viewControllers]  objectAtIndex:0];
UINavigationController *rolesTVCnav = [[tabBarController viewControllers] objectAtIndex:1];

// The Persons Table View Controller (First Nav Controller Index 0)
PersonsTVC *personsTVC = [[personsTVCnav viewControllers] objectAtIndex:0];
personsTVC.managedObjectContext = self.managedObjectContext;    

// The Roles Table View Controller (Second Nav Controller Index 0)
RolesTVC *rolesTVC = [[rolesTVCnav viewControllers] objectAtIndex:0];
rolesTVC.managedObjectContext = self.managedObjectContext;

//NOTE: Be very careful to change these indexes if you change the tab order

// Override point for customization after application launch.
// UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
// RolesTVC *controller = (RolesTVC *)navigationController.topViewController;
// controller.managedObjectContext = self.managedObjectContext;
return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
}

- (void)applicationWillTerminate:(UIApplication *)application
{
[self saveContext];
}

- (void)saveContext
{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil)
{
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
{
    /*
     Replace this implementation with code to handle the error appropriately.

     abort() causes the application to generate a crash log and terminate. You should not  use this function in a shipping application, although it may be useful during development. 
     */
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
} 
}
}

#pragma mark - Core Data stack

- (NSManagedObjectContext *)managedObjectContext
{
if (__managedObjectContext != nil)
{
return __managedObjectContext;
}

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
__managedObjectContext = [[NSManagedObjectContext alloc] init];
[__managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return __managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel
{
if (__managedObjectModel != nil)
{
return __managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return __managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (__persistentStoreCoordinator != nil)
{
return __persistentStoreCoordinator;
}

NSURL *storeURL = [[self applicationDocumentsDirectory]    URLByAppendingPathComponent:@"StaffManager.sqlite"];

NSError *error = nil;
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]    initWithManagedObjectModel:[self managedObjectModel]];


NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                     [NSNumber numberWithBool:YES],    NSMigratePersistentStoresAutomaticallyOption,
                     [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType   configuration:nil URL:storeURL options:options error:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}    

return __persistentStoreCoordinator;
}

#pragma mark - Application's Documents directory


- (NSURL *)applicationDocumentsDirectory
{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

@end

ここで、データ エンティティに対して両方のクラスを使用し、両方のクラスでマネージド オブジェクトを宣言したことに注意してください。1 つ確かなことは、コア データを使用する場合、最初のビューにマネージド オブジェクトが必要であることです。これで問題が解決しない場合は、ティム ロードリーのコア データ チュートリアルまたはポール ハガーティのスタンフォード コア データ クラスを参照することをお勧めします。プロジェクト全体を確認する必要がある場合はお知らせください。ダウンロードできるように何かをまとめてリンクを配置してください。ただし、適切なモデルを作成し、アプリデリゲートで適切なメソッドを使用している場合は、私がしたこと、それはうまくいくはずです。これが私の友人に役立つことを願っています。

于 2013-02-07T03:43:08.217 に答える
0

このサンプルiPhoneコードを確認してください。

http://developer.apple.com/library/ios/#samplecode/iPhoneCoreDataRecipes/Introduction/Intro.html

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
//  Get a reference to our detail view
PicturelistDetail *pld = (PicturelistDetail *)[segue destinationViewController];

//  Pass the managed object context to the destination view controller
pld.managedObjectContext = managedObjectContext;

//  If we are editing  we need to pass some stuff, so check the segue title first
if ([[segue identifier] isEqualToString:@"EditPicture"])
{
    //  Get the row we selected to view
    NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];

    //  Pass the object from the table that we want to view
    pld.currentPicture = [pictureListData objectAtIndex:selectedIndex];
}
}

plsはそれをあなたのコードに変更して試してみてください。

ビューコントローラでプロパティを宣言します

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
于 2013-02-07T02:51:54.693 に答える
0

「SCDMasterViewController」内にmanagedObjectContextというプロパティを設定する必要があるように見えます(別の名前をお勧めします)。

エラーは、プロパティが宣言されていないことを示しています。

これがお役に立てば幸いです。

于 2013-02-07T02:54:04.203 に答える