TweetFollow Us on Twitter

Nov 97 - Getting Started

Volume Number: 13 (1997)
Issue Number: 11
Column Tag: Getting Started

VerySimpleText, Version 2

by Dave Mark , Copyright1997, All Rights Reserved

Three months ago, the August Getting Started column featured a program called VerySimpleText. We built this first version of VerySimpleText using ProjectBuilder and InterfaceBuilder. We started off by editing the nib file (the first version of VerySimpleText wrapped its entire user interface into a single nib file).

We added a Format submenu to the application's default menu, thus adding a series of powerful font, text, and page manipulation features to VerySimpleText. This was done by dragging a Format menu from the menu palette in the palette window.

We also added a scrollable text area (implemented by the NSScrollView class) to the default application window. We did this by dragging a scrollable text view from the DataViews portion of the palette window. We used the NSScrollView inspector to set the autosizing for this view so the scrollable text view grew and shrank along with its containing window. We used InterfaceBuilder's Test Interface feature to test out the window, making sure it looked and behaved as we wanted it to.

Next, we added an info panel (an about box) to VerySimpleText, along with a menu item to bring up the info panel. We edited an existing menu item (Info Panel...) to create our "About VerySimpleText..." item. We used the NSMenuItem inspector to enable the item (unchecking the disabled checkbox, actually). To create the panel itself, we used the Windows portion of the palette window and dragged out our new window, changing the name of the window instance in the nib window and the window's title in the inspector. We also used the palette window to drag some default text into the new info panel.

Once the about panel was built, we created an AboutPanelController class which brought up the about panel when the "About VerySimpleText..." item was selected. Working in the Classes tab within the nib window, we first subclassed NSObject, then created one outlet (abtWindow) and one action (show:). As a reminder, think of an outlet as a variable or object you want associated with your class. When InterfaceBuilder generates the source code for this class, outlets are declared in the header file as type id. An action is a method. In this case, the show: method will bring up the about panel.

Once we were done with our nib file, we told InterfaceBuilder to generate the source files for this project and to add them to the project.

Our next step was to link the "About VerySimpleText..." menu item to the AboutPanelController so when it was selected, the show: method would get called and the panel would appear. First, we instantiated our newly created AboutWindowController class. The instance appeared in the nib window's Instances tab. We then control-dragged from the "About VerySimpleText..." menu item (it's in the menu itself) to the AboutWindowController instance in the nib window. In the inspector window, we clicked the connect button to establish this link. Now, when the "About VerySimpleText..." item is selected, the AboutWindowController's show: method will be called.

Next, we control-dragged from the AboutWindowController instance to our AboutWindow instance. When the link appeared, we moved to the inspector window and clicked on the abtWindow outlet and clicked the Connect button to establish the link. This links the AboutWindowController's abtWindow variable to the AboutWindow. We added a line to the show: method to bring up the window:

- (void)show:(id)sender
{
	[abtWindow makeKeyAndOrderFront:self];
}

The Model, View, Controller Paradigm

Before we move on to this month's additions to VerySimpleText, I thought it might be useful to talk about the Model, View, Controller paradigm, described in Discovering OpenStep: A Developer Tutorial. The Model, View, Controller paradigm is also known as MVC. MVC originated with Smalltalk-80. It categorizes objects as either models, views, or controllers.

Models are objects that emulate some process or represent some knowledge-base. For example, an Employee object represents the knowledge or data associated with an employee. It is a model of an employee. A waterworks object might model the process of converting waste water to clean water and might include the data associated with that process. In general, a model object does not have a user interface. A model object may be distributable and persistent. A model class may be reusable and portable.

View objects are the user interface of your application. Anything displayed by your application is displayed in a view. For example, a window, editable, static, or scrolling text area, button, and scroll bar are all examples of view objects. View objects have no special knowledge of the data they display. In OpenStep, the Application Kit contains a complete set of view objects, all of them designed independent of any model objects. As is evidenced by the Application Kit, view objects are reusable.

Controller objects are the mediators between model objects and view objects. Typically, you'll have one controller object per window (or, possibly, a single controller for your entire application). Your controller object communicates between a model object and its representative view object. For example, an employeeController might use data from an employee object and use that data to create a visible representation of that employee within a view object. At the application level, a controller object would take care of tasks such as loading nib files and acting as a delegate for a window or application.

Delegates

Delegates allow you to provide methods that get called by a class without actually having to subclass the class. Classes which allow delegates feature a set of delegation methods. For example, the NSWindow class features a delegation method called windowWillClose. In this month's sample program, we're going to create a class called Document which will act as an NSWindow delegate. When the NSWindow object gets ready to close, it first calls the delegate's windowWillClose method (assuming the delegate provides such a method). When we define the Document class, we'll provide a windowWillClose method so you can see how this works. You might want to take a look at the NSApplication and NSWindow classes. Their delegation methods are listed at the end of their respective files.

Loading A Nib File

As you've already seen, every application comes with at least one nib file. The nib file is similar to a Macintosh resource file, though it has much more of an object orientation. In fact, one of the primary things stored in a nib file is a set of archived objects. The information in the nib file includes information about each object (like object size and location). It also reflects the position of each object in the overall object hierarchy as well as details about connections between objects in the hierarchy (connections such as the ones we created in the August version of VerySimpleText).

An important part of the object hierarchy is the File's Owner object. Figure 1 shows VerySimpleText's main nib file with the icon representing the File's Owner object in the upper left corner of the Instances tab. The File's Owner sits at the top of each nib file's archived object hierarchy and comes into play when you want to load a nib file other than the main nib file (which is loaded for you automatically).

Figure 1. VerySimpleText's main nib file, showing the File's Owner object.

This line of code:

[NSBundle loadNibNamed:@"NEXTSTEP_Document" owner:self]

loads a nib file named "NEXTSTEP_Document.nib" and sets the File's Owner of the loaded nib file to point to the specified File's Owner. For example, in this month's sample program, we'll define a Document class and we'll tell InterfaceBuilder that the Document class will act as the File's Owner in "NEXTSTEP_Document.nib". Before the nib file can be loaded, we instantiate a Document object. In the Document's init method, we'll call the method loadNibNamed, passing in the nib file name "NEXTSTEP_Document.nib", as well as the object reference self, which refers to the Document object. This second parameter is used as the newly opened nib file's owner.

And Now, Addint to Verysimpletext

Hopefully, the quick review above brought you back up to speed on the overall structure of the August version of VerySimpleText and gave you enough background to follow this month's changes. This month, we're going to add the ability to handle multiple documents to VerySimpleText. We'll tie this functionality to the Document menu's New item. You'll want to start off with a copy of the August version of VerySimpleText. Be sure to keep a copy of the original around just in case. I named my original folder VerySimpleText.01 and named the copy VerySimpleText.02. Once you've made your copy, open the ProjectBuilder project in the duplicate.

  • Find the file PB.project in the duplicate directory and double-click it to launch ProjectBuilder.
  • Next, we're going to create a new nib file.
  • Click the ProjectBuilder Interfaces item, then double-click the NEXTSTEP_VerySimpleText.01.nib file.
  • The selected nib file will be opened in InterfaceBuilder. Now to create the new file:
  • In InterfaceBuilder, select Document/New Module/New Empty.

A new, untitled nib window will appear (See Figure 2). If you click on the Instances tab, you'll see two instances. One is the File's Owner. If you click on the File's Owner icon, the inspector window (attributes popup) will list a set of classes and the NSObject class will be selected. We'll revisit this a bit later in the column.

Figure 2. The new, untitled nib file.

  • Click on the Classes tab in the new nib window.
  • Select NSObject.
  • Select Classes/Subclass.
  • Rename the new subclass from MyNSObject to Document.
  • Save the new nib file.

You'll name your new nib file as NEXTSTEP_Document.nib (you can leave off the .nib if you like). Be sure to save the new nib file in the same directory as the main nib file, NEXTSTEP_VerySimpleText.01.nib (Figure 3).

Figure 3. Saving the new nib file.

  • When asked, say yes to insert the file in the project.

You will now be in ProjectBuilder.

  • Go back to InterfaceBuilder.
  • Be sure the Document line in the nib file's Classes tab is hilited.
  • Click on the outlet icon (the left of the two icons).
  • Be sure that the Outlets line is highlighted.
  • Select Classes/Add Outlet.
  • Change the outlet name myOutlet to window.
  • Click on the outlet icon to get out of outlet mode.
  • Select Classes/Create Files.
  • When asked whether we want to create a Document.h and .m file, click Yes.
  • When asked to insert files in project, click Yes.
  • We'll be back in Project Builder.

Go back to InterfaceBuilder.

  • Back in the nib window, click on the Instances tab.
  • Click on File's Owner.

In the inspector window, the class NSObject will be selected.

  • Scroll up to Document and select it.

Document will now be highlighted when you click on File's Owner.

  • Bring the original nib file to the front.
  • In the Instances tab, select the MyWindow icon.
  • Select Edit/Cut.
  • When you are asked Do you really want to delete the window?", click Delete.
  • Bring the new nib file to the front.
  • Select Edit/Paste.

The MyWindow icon should appear in the new nib window and the window itself should reappear.

  • Hold down the control key and drag from File's Owner icon to MyWindow icon.
  • When you let go, go to the inspector window and click Connect.

You've just connect MyWindow to the File Owner's outlet (in this case, the Document classes' window variable).

  • In the NEXTSTEP_Document.nib window, control drag from MyWindow to File's Owner.
  • Select the word delegate in the left-hand column.
  • Click the Connect button.

You've just made Document MyWindow's delegate.

  • Select Document/Save.

We are now done with this nib window.

  • Bring the old nib file to the front.
  • Click on the nextstep menu to bring it to the front.
  • Select Tools/Palettes/Palettes.
  • Select the leftmost palette (Menus).
  • Drag a Document menu into the nextstep menu, just below Info

The new Document menu will appear, just to the right of the nextstep menu.

  • In the Document menu, click on New.
  • In the inspector window, select attributes from the popup menu.
  • Click the Disabled checkbox so it is unchecked.
  • In the Document menu, click on Close.
  • In the inspector window, click the Disabled checkbox so it is unchecked.
  • Click on the old nib window and select the Classes tab.
  • Click on NSObject.
  • Select Classes/Subclass.
  • Rename subclass to AppDelegate.
  • Click on action icon (on right).
  • Click on Actions line, select Classes/Add Action.
  • Rename new Action to new:.
  • Click off the Actions icon.
  • Click Classes/CreateFiles.
  • Create the files (answer yes to create files and add to project).

We are now back in ProjectBuilder.

  • Go back to InterfaceBuilder.
  • In the old nib file's classes tab, select AppDelegate line.
  • Select Classes/Instantiate.
  • In the instances tab, control-drag from File's Owner to AppDelegate.
  • In the inspector window, be sure delegate is selected, then click Connect.

We have just marked AppDelegate as the NSApplication delegate. We won't implement any of the NSApplication delegate methods in our AppDelegate code, but we could. Take a look at NSApplication and take a few of the delegation methods for a spin.

  • Go to the nextstep menu and control-drag from New to AppDelegate in the old nib window.
  • In the inspector window, select new from the actions list, then click Connect.

We've just connected the new menu item to the AppDelegate's new: method.

  • Select Document/Save.

OK. That's it for the nib files. Now all we need to do is add a bit of code and we are on our way.

  • Go to ProjectBuilder.
  • Under Classes, select Document.m.

Here's what the code looks like now:

#import "Document.h"

@implementation Document

@end
  • Edit the code so it looks like this:
#import "Document.h"

@implementation Document

- init
{
	//Find the nib and load it in.  This instance will be the
	//File's Owner object, so we pass ourself as owner
	if (![NSBundle loadNibNamed:
					@"NEXTSTEP_Document" owner:self])
	{
		//for whatever reason, we failed.  Clean up and go
		NSLog(@"Failed to load Document.nib");
		[self release];
		return nil;
	}
	return self;
}

//Since the Document is the Windows's delegate,
//it will get the following
//method called whenever the window closes.  
- (void)windowWillClose:(NSNotification *)aNotification
{
	//We remove ourself as the delegate as
	//we are going to release ourselves
	[window setDelegate:nil];
	//Let garbage collection do the actual deletion
	[self autorelease];
}

@end
  • Under Classes, select AppDelegate.m.

Here's what the code looks like now:

#import "AppDelegate.h"

@implementation AppDelegate

- (void)new:(id)sender
{
}

@end

Edit the code so it looks like this:

#import "AppDelegate.h"

@implementation AppDelegate

- (void)new:(id)sender
{
}

@end

Change it to look like this:

#import "AppDelegate.h"
#import "Document.h"

@implementation AppDelegate

- (void)new:(id)sender
{
	//Just instantiate a Document. It will know what to do.
	[[Document alloc] init];
}

@end
  • Click on the hammer icon to bring up the project build window.
  • Click on the hammer again to build the project.
  • When prompted with the Save Modified Files dialog, click Save and build.
  • Assuming the build succeeds, click on the monitor icon to bring up the launch window.
  • Click on the monitor icon in the launch window to run the application.

When the application runs, select Document/New to create new windows.

Till Next Month...

Between delegates, File's Owner, and nib file loading, you've learned a lot this month. Be sure to spend some time looking at NSWindow and NSApplication to get a feel for the power of delegation. This will give you something to chew on until we have releases of Rhapsody and Rhapsody developer tools.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Firetask Pro 4.2.2 - Innovative task man...
Firetask Pro uniquely combines the advantages of classical priority-and-due-date-based task management with GTD. Stay focused and on top of your commitments - Firetask Pro's "Today" view shows all... Read more
Bookends 13.4.3 - Reference management a...
Bookends is a full-featured bibliography/reference and information-management system for students and professionals. Bookends uses the cloud to sync reference libraries on all the Macs you use.... Read more
LibreOffice 6.4.5.2 - Free, open-source...
LibreOffice is an office suite (word processor, spreadsheet, presentations, drawing tool) compatible with other major office suites. The Document Foundation is coordinating development and... Read more
Thunderbird 68.10.0 - Email client from...
As of July 2012, Thunderbird has transitioned to a new governance model, with new features being developed by the broader free software and open source community, and security fixes and improvements... Read more
Firefox 78.0.1 - Fast, safe Web browser.
Firefox offers a fast, safe Web browsing experience. Browse quickly, securely, and effortlessly. With its industry-leading features, Firefox is the choice of Web development professionals and casual... Read more
BetterTouchTool 3.389 - Customize multi-...
BetterTouchTool adds many new, fully customizable gestures to the Magic Mouse, Multi-Touch MacBook trackpad, and Magic Trackpad. These gestures are customizable: Magic Mouse: Pinch in / out (zoom)... Read more
Slack 4.7.0 - Collaborative communicatio...
Slack brings team communication and collaboration into one place so you can get more work done, whether you belong to a large enterprise or a small business. Check off your to-do list and move your... Read more
OsiriX Lite 11.0.3 - 3D medical image pr...
OsiriX Lite is an image processing software dedicated to DICOM images (".dcm" / ".DCM" extension) produced by medical equipment (MRI, CT, PET, PET-CT, ...) and confocal microscopy (LSM and BioRAD-PIC... Read more
Wireshark 3.2.5 - Network protocol analy...
Wireshark is one of the world's foremost network protocol analyzers, and is the standard in many parts of the industry. It is the continuation of a project that started in 1998. Hundreds of... Read more
Dabble 1.6.1 - Organize your manuscript,...
Dabble organizes your manuscript, story notes, and plot. Dabble simplifies the story, leaving more room in your brain to create, which is what being a writer is really about. Organize your story.... Read more

Latest Forum Discussions

See All

Pokemon Go's July Community Day wil...
Pokemon Go developers have announced the details concerning the upcoming Gastly Community Day. This particular event was selected by the players of the game after the Gas Pokemon came in second place after a poll that decided which Pokemon would... | Read more »
Clash Royale: The Road to Legendary Aren...
Supercell recently celebrated its 10th anniversary and their best title, Clash Royale, is as good as it's ever been. Even for lapsed players, returning to the game is as easy as can be. If you want to join us in picking the game back up, we've put... | Read more »
Detective Di is a point-and-click murder...
Detective Di is a point-and-click murder mystery set in Tang Dynasty-era China. You'll take on the role of China's best-known investigator, Di Renjie, as he solves a series of grisly murders that will ultimately lead him on a collision course with... | Read more »
Dissidia Final Fantasy Opera Omnia is se...
Dissidia Final Fantasy Opera Omnia, one of Square Enix's many popular mobile RPGs, has announced a plethora of in-game events that are set to take place over the summer. This will include several rewards, Free Multi Draws and more. [Read more] | Read more »
Sphaze is a neat-looking puzzler where y...
Sphaze is a neat-looking puzzler where you'll work to guide robots through increasingly elaborate mazes. It's set in a visually distinct world that's equal parts fantasy and sci-fi, and it's finally launched today for iOS and Android devices. [... | Read more »
Apple Arcade is in trouble
Yesterday, Bloomberg reported that Apple is disappointed in the performance of Apple Arcade and will be shifting their approach to the service by focusing on games that can retain subscribers and canceling other upcoming releases that don't fit... | Read more »
Pixel Petz, an inventive platform for de...
Pixel Petz has built up a sizeable player base thanks to its layered, easy-to-understand creative tools and friendly social experience. It revolves around designing, trading, and playing with a unique collection of pixel art pets, and it's out now... | Read more »
The King of Fighters Allstar's late...
The King of Fighters ALLSTAR, Netmarble's popular action RPG, has once again been updated with a plethora of new content. This includes battle cards, events and 21 new fighters, which increases the already sizeable roster even more. [Read more] | Read more »
Romancing SaGa Re;univerSe, the mobile s...
Square Enix latest mobile spin-off Romancing SaGa Re;univerSe is available now globally for both iOS and Android. It initially launched in Japan back in 2018 where it's proven to be incredibly popular, so now folks in the West can finally see what... | Read more »
Away: Journey to the Unexpected is a sto...
Away: Journey to the Unexpected looks really quite lovely. Stylish, cute, and clearly heavily inspired by Japanese animation, it's amongst the best-looking mobile games on the horizon. Developed by a two-person team, this story-driven rogue-lite... | Read more »

Price Scanner via MacPrices.net

July 4th Sale: Woot offers wide range of Macs...
Amazon-owned Woot is blowing out a wide range of Apple Macs and iPads for July 4th staring at $279 and ranging up to just over $1000. Models vary from older iPads and 11″ MacBook Airs to some newer... Read more
Apple Pro Display XDR with Nano-Texture Glass...
Abt Electronics has Apple’s new 32″ Pro Display XDR model with the nano-texture glass in stock and on sale today for up to $144 off MSRP. Shipping is free: – Pro Display XDR (nano-texture glass): $... Read more
New 2020 Mac mini on sale for up to $100 off...
Amazon has Apple’s new 2020 Mac minis on sale today for $40-$100 off MSRP with prices starting at $759. Shipping is free: – 2020 4-Core Mac mini: $759 $40 off MSRP – 2020 6-Core Mac mini: $998.99 $... Read more
July 4th Sale: $100 off every 2020 13″ MacBoo...
Apple resellers have new 2020 13″ MacBook Airs on sale for $100 off Apple’s MSRP as part of their July 4th sales. Starting at $899, these are the cheapest new 2020 MacBooks for sale anywhere: (1) B... Read more
This hidden deal on Apple’s site can save you...
Are you a local, state, or federal government employee? If so, Apple offers special government pricing on their products, including AirPods, for you as well as immediate family members. Here’s how... Read more
Apple Watch Series 3 models on sale for new l...
Amazon has Apple Watch Series 3 GPS models on sale for $30 off MSRP, starting at only $169. Their prices are the lowest available for these models from any Apple reseller. Choose Amazon as the seller... Read more
Deal Alert! Get these refurbished 2018 13″ Ma...
Apple has restocked and lowered prices on select Certified Refurbished 2018 13″ MacBook Airs, starting at only $679. Each MacBook features a new outer case, comes with a standard Apple one-year... Read more
July 4th Sale: 13″ 2.0GHz MacBook Pros for $2...
B&H Photo has new 2020 13″ 2.0GHz MacBook Pros on sale for $200 off Apple’s MSRP as part of their July 4th sale. Prices start at $1599. These are the same MacBook Pros sold by Apple in their... Read more
July 1 only: $100 off Apple iPhone 11, 11 Pro...
Boost Mobile is offering Apple iPhone 11, 11 Pro, and iPhone 11 Pro Max models for $100 off MSRP with service. Their discount reduces the cost of an iPhone 11/64GB to $599, iPhone 11 Pro to $899 for... Read more
Apple offers $50-$100 Education discount on i...
Purchase a new 12.9″ or 11″ iPad Pro at Apple using your Education discount, and Apple will take $50-$100 off their MSRP. All teachers, students, and staff of any educational institution with a .edu... Read more

Jobs Board

Operating Room Assistant, *Apple* Hill Surg...
Operating Room Assistant, Apple Hill Surgical Center - Full Time, Day Shift, Monday - Saturday availability required Tracking Code 62363 Job Description Operating Read more
Perioperative RN - ( *Apple* Hill Surgical C...
Perioperative RN - ( Apple Hill Surgical Center) Tracking Code 60593 Job Description Monday - Friday - Full Time Days Possible Saturdays General Summary: Under the Read more
Product Manager, *Apple* Commercial Sales -...
Product Manager, Apple Commercial Sales Austin, TX, US Requisition Number:77652 As an Apple Product Manager for the Commercial Sales team at Insight, you Read more
*Apple* Mac Product Engineer - Barclays (Uni...
Apple Mac EngineerWhippany, NJ Support the development and delivery of solutions, products, and capabilities into the Barclays environment working across technical Read more
Blue *Apple* Cafe Student Worker - Pennsylv...
…enhance your work experience. Student positions are available at the Blue Apple Cafe. Employee meal discount during working hours. Duties include food preparation, Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.