Question

Basically I want to use a nib file and view controller as a template for a view that I plan to create a number of times. This nib will have a couple of labels and custom views. The idea is that I will iterate through an array of objects and for each I will create an instance of this controller and set a property to that of the object from the array.

This all works nicely at the moment except for one thing - the labels won't update when I call setStringValue: !!!

I'm using a method within the view controller's code to make the change but it just doesn't work, I'm guessing that the IBOutlet isn't being hooked up properly, which is strange because the custom views are hooking up perfectly.

Any ideas?

Was it helpful?

Solution

When you alloc your NSViewControllers, just init with name of NIB:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

OTHER TIPS

Set a breakpoint on awakeFromNib and look in the debugger what the value of the label outlet is. All outlets should have been connected before awakeFromNib is being called. If it is still nil, you have your answer. Calling setStringValue: on nil does exactly "nothing". In that case you have not correctly bound the outlet or maybe you once had it bound correctly and later on changed the name, in that case there should be a yellow warning triangle in Xcode4 or interface builder indicating that something is wrong; however it will not prevent your app from building or running, the outlet will simply keep its initial value after object creation (which is nil).

Thanks for the replies, they were helpful but not quite what I was getting at. I ended up solving it by creating an empty NIB and filling it with just a custom NSView and a few other controls. I created an NSView subclass with IBOutlets for those controls and set the custom view's identity to my subclass in interface builder. The trick in getting it to work each time I wanted to draw it was by making a class method in my subclass that would load the nib and return the view set up the way I wanted.

Code below:

+(id)todoViewFromNibWithFrame:(NSRect)frameRect todoList:(TodoList *)aTodoList
{
    NSNib *todoViewNib = [[NSNib alloc] initWithNibNamed:@"TodoView" bundle:nil];
    NSArray *objects = nil;

    id todoView = nil;

    [todoViewNib instantiateNibWithOwner:nil topLevelObjects:&objects];
    for (id object in objects) {
        if ([object isKindOfClass:[self class]]) {
            todoView = object;
            [todoView setTodoList:aTodoList];
            break;
        }
    }

    [todoViewNib release];
    return todoView;
}

Thanks again for the replies! Steve

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top