outlet - это объект интерфейса, который соединяется с runtime объектом в вашем коде. Они обозначаются как IBOutlet, и распознаются Interface Builder редактором. Могут быть видимые как текстовые поля или метки, а могут невидимые как data source и delegate для table view.
MasterViewController.h
MasterViewController наследник UITableViewController, который в свою очередь наследник UIViewController, последний содержит outlet-ы view и searchDisplayController.
Также как и First Responder коллекционирует все действия (actions) который может вызвать любой first responder, также Connections inspector сканирует иерархию наследования на outlets с которыми можно соединиться. Они показываются в Connections inspector, при создании соединения.
Кажется немного запутанным, что один объект в некотором контексте содержит outlet (view в MasterViewController) а в другом контексте на него ссылается другой объект, как в случае с dataSource и delegate в MasterViewController’s adopted protocols. UITableView пример этого, и это то как оно работает с Core Data.
Чтобы добавить работу с новым полем нужно изменить метод следующим образом:
Чтобы отобразить его нужно в 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.
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.