From b5bc8b3672d77eb6443a889c0860446026c55d5c Mon Sep 17 00:00:00 2001 From: Wojciech Nagrodzki <278594+wnagrodzki@users.noreply.github.com> Date: Thu, 9 Jan 2014 09:51:02 +0100 Subject: [PATCH] UIView --- Cocoa Programming Guidelines.pdf | Bin 73821 -> 78673 bytes Cocoa Programming Guidelines.tex | 97 +++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) diff --git a/Cocoa Programming Guidelines.pdf b/Cocoa Programming Guidelines.pdf index 7ba4e946043e05ab6cf8e6dae337b229b14221e3..0d80d0dc0c4f15aa55600615704679f948a38049 100644 GIT binary patch delta 21291 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 delta 16402 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 diff --git a/Cocoa Programming Guidelines.tex b/Cocoa Programming Guidelines.tex index 7e3d989..6130bc0 100644 --- a/Cocoa Programming Guidelines.tex +++ b/Cocoa Programming Guidelines.tex @@ -687,4 +687,101 @@ Main method checks if operation is cancelled at the very beginning and interrupt \end{codelisting} +\section{UIView} + +\subsection{View is usually initialized in two ways} + +By calling initWithFrame, or initWithCoder method when it is unarchived form nib file. Both situations are covered. + +\begin{codelisting} +@interface ExampleView () + +@property (strong, nonatomic) UITextField * textField; + +@end + +@implementation ExampleView + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self initialize]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) { + [self initialize]; + } + return self; +} + +- (void)initialize +{ + _textField = [[UITextField alloc] init]; + _textField.translatesAutoresizingMaskIntoConstraints = NO; + [self addSubview:_textField]; + + NSDictionary * views = NSDictionaryOfVariableBindings(_textField); + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-8-[_textField]-8-|" + options:0 + metrics:nil + views:views]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[_textField]-8-|" + options:0 + metrics:nil + views:views]]; +} +\end{codelisting} + +Note that we do not implement -encodeWithCoder: method. UIViews and UIViewControllers does not follow normal serialization process, their state is persisted in model. + + +\subsection{Interface of generic view} + +View exposes minimal set of properties and methods that are required for its configuration. +Property is not backed up by instance variable, but by view's or subview's property, if possible. + +\begin{codelisting} +- (NSString *)name +{ + return self.nameLabel.text; +} + +- (void)setName:(NSString *)name +{ + self.nameLabel.text = name; +} +\end{codelisting} + +View is independent of model. Mapping between view's and model's properties is kept in a category on that view. This way view controller is kept cleaner. + +\begin{codelisting} +@implementation UITableViewCell (Person) + +- (void)configureWithPerson:(Person *)person +{ + self.imageView.image = person.photo; + self.textLabel.text = person.name; +} +\end{codelisting} + + +\subsection{Interface of specific view} + +Specific view is tightly coupled with model. It exposes one method that takes a model object and configures the view. + +\begin{codelisting} +@interface PersonTableViewCell : UITableViewCell + +- (void)configureWithPerson:(Person *)person + +@end +\end{codelisting} + + \end{document}