1

私のアプリは2つのビューで構成されています。MainView と ResultsView。MainView には入力が必要な UITextField が含まれており、ボタンがタッチされると、ビューが ResultsView に変わります。以下は、それを処理するコードの重要な部分です。

// In CallerIDAppDelegate.h
@class MainViewController;
@class ResultsViewController;

@interface CallerIDAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;

    IBOutlet MainViewController *mainViewController;
    IBOutlet ResultsViewController *resultsViewController;

    NSString *phoneNumber;

   NSMutableArray *parsingResults;

   BOOL isSearchingForSaved;
}
[...]

// In CallerIDAppDelegate.m
[...]
- (void)applicationDidFinishLaunching:(UIApplication *)application {
    /* Set up and display MainView */
    MainViewController *mainController = [[MainViewController alloc]    initWithNibName:@"MainView" bundle:[NSBundle mainBundle]];
    self.mainViewController = mainController;
    [window addSubview:mainController.view];

    // Override point for customization after application launch
    [window makeKeyAndVisible];
}

-(void)switchViews{
    if(self.resultsViewController == nil){
        ResultsViewController *resultsController = [[ResultsViewController alloc] initWithNibName:@"ResultsViewController" bundle:nil];
        self.resultsViewController = resultsController;
        [resultsController release];
    }

    if(self.mainViewController.view.superview == nil){
        [resultsViewController.view removeFromSuperview];
        [window insertSubview:mainViewController.view atIndex:0];
    } else {
        [mainViewController.view removeFromSuperview];
        [window insertSubview:resultsViewController.view atIndex:0];
    }
}

今、ResultsViewいくつかのコンテンツを含むテーブルビューがあります。私がしたいのは、そのテーブルビューの行が選択されたときにABUnknownPersonViewController、ユーザーが連絡先をアドレス帳に保存できるようにすることです。

だからでResultsViewController.m

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    [...]
    ABUnknownPersonViewController *unknownPersonView = [[[ABUnknownPersonViewController alloc] init] autorelease];

    [unknownPersonView setUnknownPersonViewDelegate:self];

    [unknownPersonView setDisplayedPerson:personRecord];
    [unknownPersonView setAllowsAddingToAddressBook:YES];

    UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:unknownPersonView] autorelease];


    [self presentModalViewController:navigationController animated:YES];
}

- (void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonView didResolveToPerson:(ABRecordRef)person {
    CallerIDAppDelegate *delegate = (CallerIDAppDelegate *)[[UIApplication sharedApplication] delegate];
    DLog("Called!");
    [self dismissModalViewControllerAnimated:YES]; //caused crash

    // Caused crash too
    //[delegate.resultsViewController dismissModalViewControllerAnimate:YES]; 
}

行を選択すると、ABUnknownPersonViewControllerが正しく表示されます。また、送信されたすべての正しい情報が含まれてpersonRecordおり、[連絡先に追加] ボタンが押されたときに連絡先がアドレス帳に適切に保存されます。しかし、最後のステップで完了(またはキャンセル)ボタンが押されると、かなり悪いクラッシュが発生します。

問題は、起動時に「43453スタックフレームをロードしています...」と表示されるため、デバッガから何も理解できないことです。この手順を停止します。スタック トレースの先頭は次のとおりです。

[CALayer sublayers];

そして、たくさんあります

[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]

教えてください。私が間違っているのは、おそらく少し愚かなことだと確信しています。私はそれを修正するために何時間も試みてきましたが、できません。:(

4

1 に答える 1

4

直して……本当にバカでした。

そのはず:

- (void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonView didResolveToPerson:(ABRecordRef)person {
CallerIDAppDelegate *delegate = (CallerIDAppDelegate *)[[UIApplication sharedApplication] delegate];
DLog("Called!");
[unknownPersonView dismissModalViewControllerAnimated:YES];

}

于 2009-09-06T23:09:25.567 に答える