Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UISplitViewController EXC_BAD_ACCESS on rotation using ARC

I am using a UISplitViewController on ARC but it seems to be crashing after a few rotation events:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x80069f69
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x32461f78 objc_msgSend + 16
1   UIKit                           0x3588b280 -[UISplitViewController _calculateDelegateHiddenMasterOrientations] + 52
2   UIKit                           0x3588cca8 -[UISplitViewController setViewControllers:] + 1344
3   PUC                             0x000d0a42 0x1000 + 850498
4   UIKit                           0x35644ade -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 938
5   UIKit                           0x356be7a4 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 152

Also, when I start up the app, I get this error:

Splitview controller <PUCSplitViewController: 0x36c290> is expected to have a master view controller before its used!

What I have a missed? I set it up very similar to the example project that Apple provided.

Also crashing sometimes when switching the detail view:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // Clicked Asset
    Asset *asset = [items objectAtIndex:indexPath.row];

    UIViewController *detailViewController = nil;

    // See what asset we are on
    if ([asset.title isEqualToString:@"News"]) {
        News2 *news = [[News2 alloc] initWithStyle:UITableViewStyleGrouped];
        UINavigationController *newsNav = [[UINavigationController alloc] initWithRootViewController:news];
        detailViewController = newsNav;
    } else if ([asset.title isEqualToString:@"Photos"]) {
        PhotosiPad *photos = [[PhotosiPad alloc] init];
        UINavigationController *photosNav = [[UINavigationController alloc] initWithRootViewController:photos];
        detailViewController = photosNav;
    }

    // Update the split view
    [PUCAppDelegate instance].mainSplitViewController.viewControllers = [NSArray arrayWithObjects:self.navigationController, detailViewController, nil];

    // Dismiss the popover if it's present.
    if (popoverController != nil) {
        [popoverController dismissPopoverAnimated:YES];
    }

}//end

Here is how I create the UISplitViewController in applicationDidFinishLoading:

PUCSplitViewController *splitPUC = [[PUCSplitViewController alloc] init];
self.mainSplitViewController = splitPUC;
[self.window addSubview:self.mainSplitViewController.view];
[self.window makeKeyAndVisible];

Ideas?

like image 979
Nic Hubbard Avatar asked Mar 13 '12 00:03

Nic Hubbard


1 Answers

for the

is expected to have a master view controller before its used!

error,

you need to set the delegate AFTER you set the view controllers for the splitviewcontroller.

See Use Your Loaf blog from April 6th, 2012 (No, it is not mine).

like image 191
chadbag Avatar answered Oct 02 '22 19:10

chadbag