Баг с UITableView в новом xCode

Добавляю простую таблицу с одной custom ячейкой на UIVIewController (в Storyboard), задаю делегаты, определяю required (обязательные) делегатные методы, добавляю autolayout constraints. Получаю:
Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell’s content view. We’re considering the collapse unintentional and using standard height instead.

Решение:
Необходимо дописать метод (tableView:heightForRowAtIndexPath:) делегата UITableViewDataSource. Без этого метода приложение не вылетает, но не может корректно определить высоту ячейки.

Неявное преобразование типов в Swift (implicit conversion)

Основная проблема Swift — это почти полное отсутствие неявного (implicit) приведения типов. Вы не сможете даже сложить 2 и 2.5 — целочисленное нужно будет привести к типу Double явно.

Также существует обходной путь — заставить приложение произвести действия над двумя числами (или объектами) через перегрузку операторов. Пример:

xCode. Size Classes

Оригинал — документация и презентации на сайте Apple.
Перевод:

http://habrahabr.ru/post/235181/

Суть технологии — облегчить программисту работу с экранами с разными разрешениями.

Для того, чтобы научиться пользоваться, не обязательно копировать все действия, описанные в данной статье.
Вместо этого попробуйте выложить 3 UIView’s в ряд и добиться того, чтобы левый прилегал к левому и верхнему краю, центральный — к центру и верхнему краю, правый — к правому и верхнему краю. При этом пусть они остаются квадратные и с какими-нибудь отступами между собой — на всех разновидностях устройств.

P.S. Важно помнить, что даже эта технология покрывает только всевозможные «физические» разрешения экранов и только частично учитывает (если учитывает вообще) «виртуальные» разрешения. Например, всевозможные экраны для iphone:

http://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions

Программирование Auto Layout

Источник:

http://osxdev.ru/blog/ios/79.html

Рассказывает про создание constraints кодом без использования их собственного декларативного языка.
Возможный вариант применения — одни и те же constraints на нескольких view, constraints для view, добавляемых динамически и т.д.

xCode. DBSmartPanels — незаменимо для небольших экранов ноутбуков

DBSmartPanels позволяет автоматически прятать нижние и правые панели xCode, кода они не нужны. Например, при редактировании кода не требуются панель инструментов дизайна.

Настроить дополнительные опции можно через меню Xcode >> Smart Panels…

Установка:
1)скачать репозиторий git;
2)запустить скачанный проект;
3)перезапустить xCode.

Исходники на GitHub

NSArray of selectors

Селекторы не являются объектами, поэтому их нельзя напрямую сохранять в массив. Более того не существует литерала, упрощающего преобразование селектора к объекту. Следующая функция должна помочь:

+ (NSArray *)arrayWithSelectors:(SEL)selector1, ... {
    
    NSMutableArray *arr = [NSMutableArray array];
    SEL eachObject;
    va_list argumentList;
    if (selector1) {
        
        [arr addObject:NSStringFromSelector(selector1)];
        va_start(argumentList, selector1);
        while ((eachObject = va_arg(argumentList, SEL))) {
            
            [arr addObject:NSStringFromSelector(eachObject)];
        }
        va_end(argumentList);
    }
    return arr;
}

Core Data. MagicalRecord

Core Data поддерживает многопоточность, но для этого нужно много дополнительных действий. MagicalRecord является надстройкой над Core Data и упрощает этот процесс, а также предоставляет дополнительные методы для более простого доступа к БД.

Пример записи в БД (лучше вызывать в главном потоке):

- (void)updateEntititesNamed:(NSString *)name filler:(id)filler fillSelector:(SEL)fillSelector fillParams:(NSArray *)fillParams {

Class cl = NSClassFromString(name);
[cl MR_truncateAll];
for (NSDictionary *dict in fillParams) {

NSManagedObject *obj = [cl MR_findFirstOrCreateByAttribute:BKKeyIdentifier withValue:dict[BKKeyIdentifier]];
objc_msgSend(filler, fillSelector, obj, dict);
}

[[NSManagedObjectContext MR_defaultContext] MR_saveWithOptions:MRSaveSynchronously | MRSaveParentContexts completion:^(BOOL success, NSError *error) {

if (success) {

LOG(@"You successfully saved your context.");
} else if (error) {

LOG(@"Error saving context: %@", error.description);
} else {

LOG(@"UNHANDLED ERROR!!!!!!!!!!!");
}
}

Примеры чтения из БД:

[BKTradePair MR_findAllSortedBy:@"identifier" ascending:YES];
- (BKTradePair *)getForId1:(NSString *)fromID id2:(NSString *)toID {

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id1 = %@ && id2 = %@", fromID, toID];
return [BKTradePair MR_findFirstWithPredicate:predicate];
}

ВАЖНО: лучше не пытаться хранить объекты NSManagedObject, а регулярно запрашивать их из БД или хранить их id. Главный контекст доступен только в главном потоке, а эти объекты неизвестно, в каком потоке они были созданы и, соответственно, в каком контексте (NSManagedObjectContext).
Например, если получаете все записи асинхронно и не указываете конкретный контекст, то используется вспомогательный контекст, который autorelease. Полученные через него NSManagedObject’ы существуют дольше, чем если бы они были просто autoreleased NSObject и становятся nil в конце. Происходить это может в случайные моменты времени и приводит к ошибкам в случайных местах.

iOS. Когда объекты UIViewController требуются в разных ориентациях в одном приложении

Например, если все приложение в ориентации portrait, а при клике на графике «разворачивается» на весь экран в landscape.

Источник решения:

http://stackoverflow.com/questions/24970286/differnet-orientations-for-various-view-controllers/24970381#24970381

Возможно единственное универсальное решение — использовать афинные преобразования:

-(void)setRotationInLandscapeMode:(BOOL)status
{
if(status)
{
self.navigationController.navigationBar.frame = CGRectOffset(self.navigationController.navigationBar.frame, 0.0, -20.0);
self.view.transform = CGAffineTransformMakeRotation((M_PI * (90) / 180.0));
self.view.frame = CGRectMake(0,0, 320,568 );
}
else
{
self.view.transform = CGAffineTransformMakeRotation((0));
self.view.frame = CGRectMake(0,0, 320,568 );
}
}

Здесь приведено вместе с кодом, возвращающим view в исходное положение.
Далее вызываем этот код при отображении view:

-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:YES];
[self setRotationInLandscapeMode:YES];
}

В данном коде можно брать не конкретное значение прямоугольника, а из существующего view напрямую или вычислять на основе его.

На симуляторе не работает строка:

[[UIApplication sharedApplication] setStatusBarHidden:status];

Возможно, лишняя, или правильно отображаться будет только на устройстве. Или зависит от структуры проекта.

Также не работают supportedInterfaceOrientations и подобные методы. Внутри UIViewController они просто не работают. Внутри UINavigationController они работают, но только только один раз при его создании/отображении, т.е. можно задать ориентацию только для всех UIVIewControllers внутри него единоразово и нельзя выставлять какие-либо настройки для отдельного UIViewController.

iOS. Формат даты в зависимости от региональных настроек телефона

Иногда требуется, чтобы приложение показывало не просто дату в определенном формате, а дату в зависимости от выбранной в глобальных настройках страны/региона.

Решение есть:

http://stackoverflow.com/questions/7941789/format-date-and-time-after-device-current-region-settings

Позволяет избавиться например от проблемы выбора того, что писать сначала число, потом месяц или наоборот

Gamemaker Studio. Использование нового отладчика

В Studio 1.3 появился компиллятор с breakpoints.yoyo degugger

Будет полезным при отладке сложных алгоритмов. Горячие клавиши — F5 продолжить, F9 установить breakpoint, F10, F11 — пошаговая отладка. Есть окошко слежения за переменными проекта.

В настоящее время все еще сырой. Например, установленную точку breakpoint очень сложно убрать.