Чем отличается outlet от referencing outlet

outlet - это объект интерфейса, который соединяется с runtime объектом в вашем коде. Они обозначаются как IBOutlet, и распознаются Interface Builder редактором. Могут быть видимые как текстовые поля или метки, а могут невидимые как data source и delegate для table view.

outlet-ы view и searchDisplayController


MasterViewController.h
#import <UIKit/UIKit.h>

@class DetailViewController;

#import <CoreData/CoreData.h>

@interface MasterViewController : UITableViewController
<NSFetchedResultsControllerDelegate>

@property (strong, nonatomic) DetailViewController *detailViewController;

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

@end

MasterViewController наследник UITableViewController, который в свою очередь наследник UIViewController, последний содержит outlet-ы view и searchDisplayController.

Также как и First Responder коллекционирует все действия (actions) который может вызвать любой first responder, также Connections inspector сканирует иерархию наследования на outlets с которыми можно соединиться. Они показываются в Connections inspector, при создании соединения.

Referencing outlets это outlets в других объектах которые соединены с рассматриваемым вами объектом. Можно сравнить outlet к view в MasterViewController (который фактически унаследован от UIViewController) с referencing outlet-ами dataSource и delegate в MasterViewController (фактически унаследованы от протоколов принятых UITableViewController-ом) чтобы понять разницу между outlets и referencing outlets.

Кажется немного запутанным, что один объект в некотором контексте содержит outlet (view в MasterViewController) а в другом контексте на него ссылается другой объект, как в случае с dataSource и delegate в MasterViewController’s adopted protocols. UITableView пример этого, и это то как оно работает с Core Data.

С точки зрения My Table View, outlet-ами являются dataSource и delegate, а referencing outlet это view

Преобразование даты в строку

// get a date -- in this case the current date
NSDate *date = [NSDate date];

// create a date formatter
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

// set the style for the date using a constant from the framework
[dateFormatter setDateStyle:NSDateFormatterLongStyle];

// set the style for the time using a constant
[dateFormatter setTimeStyle:NSDateFormatterLongStyle];

// you can use both date and time styles or only one

// format the date to a string
NSString *dateString = [dateFormatter stringFromDate:date];


Метод вставки объектов в Master-Detail шаблоне, в файле MasterViewController.m

- (void)insertNewObject
{
// Create a new instance of the entity managed by the fetched results controller.
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
// If appropriate, configure the new managed object.
// Normally you should use accessor methods, but using KVC here avoids the need
// to add a custom class to the template.
[newManagedObject setValue:[NSDate date] forKey:@”timeStamp”];
// Save the context.
NSError *error = nil;
if (![context save:&error])
{
/*
Replace this implementation with code to handle the error appropriately.
abort() causes the application to generate a crash log and terminate.
You should not use this function in a shipping application, although it
may be useful during development.
*/
NSLog(@”Unresolved error %@, %@”, error, [error userInfo]);
abort();
}
}


Чтобы добавить работу с новым полем нужно изменить метод следующим образом:

// existing code to set the timeStamp field
[newManagedObject setValue:[NSDate date] forKey:@”timeStamp”];

// use a date formatter to convert the current date to a string
NSDate *date = [NSDate date];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterLongStyle];
[dateFormatter setTimeStyle:NSDateFormatterLongStyle];
NSString *dateString = [dateFormatter stringFromDate:date];

// set the new field to the formatted string
[newManagedObject setValue:dateString forKey:@”newField”];


Чтобы отобразить его нужно в DetailViewController.h добавить:
@property (strong, nonatomic) IBOutlet UITextField *textField;

Далее в DetailViewController.m добавить:
@synthesize textField;

- (void)configureView
{
// Update the user interface for the detail item.
if (self.detailItem) {
self.detailDescriptionLabel.text = [self.detailItem description];
// ADD THIS LINE OF CODE FOR THE NEW FIELD
self.textField.text = [(NSManagedObject *)self.detailItem
valueForKey:@”newField”];
}
}





Q. What is the difference between an outlet and a referencing outlet?
A. An outlet is a property in an object’s interface that can be connected to an
interface element or another runtime object. A referencing outlet is a property
in another object that is connected to the object at which you are looking.

Q. What is a formatter, and why is it used?
A. A formatter is an object that can be attached to another object and transform
its data. In other languages, these transformations are often accomplished
with built-in functions. In Objective-C, there is a trade-off for slightly more
complexity in some simple cases but much more power in many other cases.