0

XCodeテンプレートの基本的なaとaをUISplitViewController実装するがあります。masterNavigationControllerdetailNavigationController

masterNavigationController呼び出しはNSObject「API」と呼ばれるもう1つの呼び出しASIHTTPRequestで、サーバーから特定のJSONデータを取得するために使用されます。

私がリクエストからの呼び出しを開始するまで、すべてがうまくてダンディです。iPadのGUIを表示し、直後にクラッシュしEXC_BAD_ACCESSます。私が受け取るエラーメッセージは次のとおりです。

2012-10-10 21:13:42.357 myapp [24409:c07] Splitviewコントローラーは、使用される前にインデックス0にビューコントローラーを持っていると予想されます。

この問題を解決するためにさまざまなことを試みました。1つはビューコントローラーの設定後にSplitViewControllerデリゲートを設定することであり、もう1つは代わりにNetworkQueueを使用することです。

これは:のコードmasterNavigationControllerです

[...]
- (void)viewDidLoad
{
    [UIHelper setNavigationBackBackground:self.navigationController.navigationBar widePage:NO];
    [UIHelper setViewBackground:self.parentViewController.view widePage:NO];
    [UIHelper setTableViewStyle:self.tableView];

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.navigationItem.leftBarButtonItem = self.editButtonItem;

    UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];
    self.navigationItem.rightBarButtonItem = addButton;

    API *api = [[API alloc] init];
    [api setDelegate:self];
    [api setDidFinishSelector:@selector(didFinish:)];
    [api getCommingRetrievals];
}
[...]

AppDelegate:

[...]
    MasterViewController *masterViewController = [[MasterViewController alloc] initWithStyle:UITableViewStylePlain];
    UINavigationController *masterNavigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController];

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

    masterViewController.detailViewController = detailViewController;

    self.splitViewController = [[UISplitViewController alloc] init];

    self.splitViewController.view.opaque = NO;
    self.splitViewController.view.backgroundColor = [UIColor clearColor];

    self.splitViewController.viewControllers = @[masterNavigationController, detailNavigationController];
    masterViewController.managedObjectContext = self.managedObjectContext;

    self.splitViewController.delegate = detailViewController;

    self.window.rootViewController = self.splitViewController;
    [self.window makeKeyAndVisible];
[...]

これはAPIオブジェクトのコードです。

- (void)getCommingRetrievals
{
    [self getRetrievalsForDate:[NSDate date]];
}

- (void)getRetrievalsForDate:(NSDate*)date
{
    NSString *stringFromDate = @"";

    if (date != nil)
    {
        // Set date string
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"yyyyMMdd"];
        stringFromDate = [formatter stringFromDate:date];
    }

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/bookings/%@", API_BASE_DOMAIN, stringFromDate]];
    [self callApi:url requestMethod:@"GET"];
}

#pragma mark - 
#pragma mark API methods

- (void)callApi:(NSURL*)url requestMethod:(NSString*)requestMethod
{
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setRequestMethod:requestMethod];
    [request setDelegate:self];
    [request setDidFinishSelector:@selector(requestFinished:)];
    [request setDidFailSelector:@selector(didFailWithError:)];
    [request startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
    if (self.delegate && [self.delegate respondsToSelector:didFinishSelector]) {
        [self.delegate performSelector:didFinishSelector withObject:self];
    }
}

行をコメントアウトしても[request startAsynchronous];、アプリはクラッシュしません。

ここで何が欠けていますか、どうすれば問題を解決できますか?

4

1 に答える 1

1

UISplitViewControllerに2つのビューコントローラーが渡されていることを確認します。

それ以外に、いくつかの慣用的なもの:

これは、セットアップの最初に正しく行う必要があります。

[super viewDidLoad];

例:`[superviewDidLoad]`コンベンション

また、ASI以外のフレームワークの使用を検討してください。それは死んだ図書館です。AFNetworking、MKNetworkingKit、またはRESTKitが適切な代替手段です。

于 2012-10-10T19:37:52.793 に答える