42
votes

I'm getting the following error from Xcode:

Couldn't compile connection: <IBCocoaTouchOutletConnection:0x401538380
<IBProxyObject: 0x40154a260> => categoryPicker => <IBUIPickerView: 0x4016de1e0>>

I've narrowed this down to a single outlet connection in storyboard. My code (about 30 views with lots of other connections) compiles and runs fine until I add a connection from a UIPicker to the view's categoryPicker property. The picker itself also works fine, I just can't reload it without getting this connection to work:

@interface FiltersTableViewController : UITableViewController <UIPickerViewDataSource, UIPickerViewDelegate> {
    NSFetchedResultsController *fetchedResultsController;
    FilterTableViewController *filterView;

    AppDelegate *appDelegate;
    NSManagedObjectContext *managedObjectContext;       
}

@property (nonatomic, strong) FilterTableViewController *filterView;
@property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;

@property (nonatomic, weak) IBOutlet UIPickerView *categoryPicker;

- (void)configureCell:(FilterTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath;
- (void)performFetch;

@end

The UIPickerView is in a UITableViewCell. Here's an image of the storyboard, the connection from "categoryPicker" to "FiltersTableViewController" causes the error: enter image description here

Thanks for any ideas, or suggestions on how to debug it!

EDIT: I removed the connection and added one line to numberOfComponentsInPickerView:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {

    categoryPicker = pickerView;

    return 1;

}

This now works!, but I'd like to understand why the connection won't work and what that error message means. Right now this seems like a kludge to me since I use IB connections everywhere else to get object references.

EDIT 2: Connecting a prototype cell generates this error: Illegal Configuration: Connection "Cell" cannot have a prototype object as its destination. Not sure if this is new in Xcode 4.5.

2
Seems like the problem is, categoryPicker is "weak" and FilterTableViewController is "strong". Try to make categoryPicker strong as well and check if that worksTeaCupApp
Thanks. Just tried it, but it doesn't change anything. (I'm under the impression that IBOutlets should be weak...I get that from here: raywenderlich.com/5773/beginning-arc-in-ios-5-tutorial-part-2).Symmetric
Yes thats technically right, sorry my bad! As I just read that in Apple documentation too!TeaCupApp
so you just want to set your ViewController as a delegate of categoryPicker...am I right? have you tried categoryPicker.delegate = self; ?TeaCupApp
The ViewController is already a delegate, and that part works. The problem is categoryPicker is nil without the connection from IB, and I can't call reloadAllComponents on it. I actually did just get something to work, but it seems like a kludge. I'll add it to the question in a sec...Symmetric

2 Answers

113
votes

The problem is that this is a prototype cell. It is meaningless to have an outlet to something in it, because it isn't a real cell: it's a model for what might be dozens or hundreds of cells, and which one would the outlet point to in that case?

23
votes

SWIFT 2

I was creating a popover segue and I was getting the same error.

What I did was follow @matt's answer by not putting it on a cell, which is logical now that he explained it!

Instead, I put the TableView as the anchor and it worked fine.

Hope that helps those in the future.