Если возникла необходимость “дать попробовать” ваше приложение заказчику/тестеру/друзьям и т.п. на этапе разработки, когда еще ничего не готово, и скачивать его из Apple Store нет возможности, и XCode у этих людей не установлен… То вы обречены Есть возможность распространения приложения через iTunes (.IPA файл). Среди большого количества людей таким образом распространить приложение не удастся (ограничение Apple на количество UUID(100 в год), привязанных к Developer-аккаунту), но для тестирования сойдет.
Для этого понадобится
- UUID телефон(ов) пользователя(ей), на которые необходимо установить приложение
- Provisioning profile, который включает эти UUID’ы
- XСode
Просто обязан написать об этом:)
Сегодня выплыла проблема случайных крешей приложения, примерно следующего плана
EXC_BAD_ACCESS
objc_msgSend + 24
-[UIWebView webView:resource:didFinishLoadingFromDataSource:] + 80
-[UIWebViewWebViewDelegate webView:resource:didFinishLoadingFromDataSource:] + 36
Проверка на двойное и преждевременное освобождение объектов ничего не дала. То есть с памятью проблем небыло. Проблема была в чем-то другом. Судя по call-Tree, было сделано предположение, что UIWebView, вызывает метод делегата, который уже был удален из памяти. По сути, такого произойти не могло, так как обычно такими делегатами являются UIViewController’ы, которые в методе dealloc вызывают [webView release].
Но! Как оказалось, этого совсем недостаточно. Итак – решение проблемы. В методе dealloc, либо в любом месте, где вы прекращаете использовать объект, у которого вы прописаны делегатом, делайте следующее [webView setDelegate:nil]. В таком случае, даже если объект будет слать какие-то сообщения делегату, то приложение не будет вылетать с ошибкой.
Вывод:Как уже было сказано выше – всегда “обNULLяйте” делегата объекта. Ну, и пример кода соотвественно.
// ViewItemController.h
@interface ViewItemController : UIViewController < UIWebViewDelegate> {
UIWebView *webView;
}
@property(nonatomic, retain) IBOutlet UIVebView * webView;
@end
// ViewItemController.m
-(void)viewDidLoad {
[[self webView] setDelegate:self]
}
//
// На самом деле вполне "понятно", что после [webView release],
// совсем не факт, что webView уничтожится, ведь retainCount
// может быть все еще больше 0. Но для понимания этого
// нужно задуматься, а на это время не всегда хватает ;)
-(void) dealloc {
[webView setDelegate:nil];
[webview release];
[super dealloc];
}
Иногда бывает необходимо узнавать о том, когда клавиатура собирается появиться или спрятаться (например, когда текстовые поля находятся в таблице и приходится уменьшать высоту таблицы так, чтобы она вся была над клавиатурой). Для этого есть 4 типа уведомлений с такими именами:
- UIKeyboardWillShowNotification – клавиатура должна появится,
- UIKeyboardDidShowNotification – клавиатура появилась,
- UIKeyboardWillHideNotification – клавиатура должна спрятаться,
- UIKeyboardDidHideNotification – клавиатура наконец спряталась.
Так вот…
Статья полностью »
Многие, наверное, уже пробовали работать с CoreData и хотя бы краем уха слышали/краем глаза видели что-то о поддержке undo/redo для контекста объектов. Дело в том, что существуют механизмы, позволяющие при изменении объектов, унаследованных от NSManagedObject и находящихся в контексте NSManagedObjectContex, производить перемещение по т.н. контекстному графу при помощи методов undo и redo. Вершины этого графа создаются путем вызова у контекста метода processPendingChanges, после чего последующие изменения объектов в контексте можно откатить до их состояния на момент создания вершины методом undo. Также можно перемещаться между созданными вершинами, вызывая методы undo (к предыдущей вершине) или redo (к следующей вершине). За обработку и управление изменениями отвечает undoManager – объект класса NSUndoManager, который есть у объекта- контекста. Сдесь небольшое уточнение – есть, если только вы программируете под Mac OS. В iPhone SDK undoManager не инициализируется при инициализации контекста!
[context undoManager] == nil;// == YES !!!!!!!!
Часто при разработке приложений возникает необходимость осуществить возможность изменения региональных настроек, языка графического интерфейса приложения в зависимости от системных настроек, другими словами, сделать приложение локализированным. Для этого iPhone SDK предоставляет широкий набор средств. О них и пойдет речь в этой статье.
Локализировать можно любые ресурсы приложения – от *.xib – файлов, до отдельных картинок. Также локализацию можно осуществлять программно и получать вручную ресурсы в зависимости от текущей локали окружения, в котором было запущено приложение. Но обо всем попорядку…
При работе в MacOSX существует проблема выбора Subversion клиента с графическим интерфейсом. Мы используем svnX. Но у него есть небольшой недостаток, который мешает работать. С svnX нельзя установить свойства. А это значит, что нельзя добавить файлы в список игнорируемых, так как это делаеться установкой свойства папки.
Решаеться эта проблема просто и достаточно быстро. Для этого нам понадобится терминал.
Предположым что есть некая папка build которая не должна попасть в subversion, а проект имеет структуру:
-trunk ---build ---src ---other
Для добавления папки build в список игнорируемых создадим файл .ignore и запишем туда список того, что мы не хотим видеть в subversion. Просто создать его нельзя, так как для этой папки могли быть установлены свойства ранее. Эти данные нужно получить из svn.
Далее мы работаем с рабочей копией проекта. В терминале переходим в папку trunk и выполняем следующую команду:
svn propget svn:ignore . > .ignore
После этого в этой папке будет создан файл .ignore. Если для этой папки уже задано свойство svn:ignore, то значение будет записано в этот файл автоматически. Нам нужно прописать имя папки (build) в файл. Думаю с этим проблем не возникнет.
Осталось только установить свойство и закомитить изменения на сервер. Выполняем команду,
Статья полностью »
При разработке приложения иногда нужно обратиться к адресной книге и получить из нее e-mail. Не все пользователи знают наизусть все свои контакты. Для выбора нужной нам информации существует визуальный компонент. Его лучше показать как модальный, а ViewController, который будет это делать, должен иметь NavigationController. Дальше в пошаговом режиме будет показано как же вызвать этот компонент и получить только нужные данные.
Шаг 1. Подключение frameworks.
Для работы с адресной книгой нам понадобиться 2 фреймворка – AddressBookUI.framework, AddressBook.framework. Первый для визуального отображения компонент похож на приложения Contacts, только без возможности добавить или редактировать контакты. Второй для доступа и работы с данными, которые возвращает визуальный компонент. Если не добавить эти фреймворки и перейти к следующим шагам – приложение работать не будет.
Шаг 2. Установка делегата
Первым делом нужно сделать импорт нужных нам файлов. А нужны нам следующие:
#import <addressbook /AddressBook.h> #import <addressbookui /AddressBookUI.h>
В UIViewController из которого будет вызываться Адресная книга нужно
Статья полностью »
Недавно встала задача следующего плана – программно выставить у UILabel толщину шрифта в bold. После недолгих поисков, выяснилось, что у UIFont вообще отсутствуют понятия вида bold, italic, и тем более bold-italic , максимум, что можно сделать, так это создать системный шрифт, при помощи одного из методов
// Some convenience methods to create system fonts + (UIFont *)systemFontOfSize:(CGFloat)fontSize; + (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize; + (UIFont *)italicSystemFontOfSize:(CGFloat)fontSize;
После увиденного, на горизонте памяти стали всплывать мысли о том, что на самом-то деле не все шрифты могут быть bold или italic. И сразу же появилась мысль – а какие все-таки шрифты могут быть? И какие вообще шрифты есть на устройствах типа iPod / iPhone?
Статья полностью »
Задача в принципе простая, и, как оказалось, нужная.
- Если вдруг, стало нехватать места на системном диске
- Или нужно удалить старый SDK (например 2.2.1), чтобы поставить новый (3.0.5)
- Или просто надоело программировать под iPhone(в Xcode) до такой степени, что просто нельзя больше терпеть его присутствие на жестком диске
(нужное подчеркнуть).
В этом случае, поможет следующая строка, выполнение которой требует прав администратора :
sudo /Developer/Library/uninstall-devtools --mode=all
После ввода пароля, через некоторое время Вы будете польностью освобождены от необходимости созерцать iPhone Development Tools вместе с SDK.
Загрузить файл с внешнего источника в приложение не составит труда. А вот при загрузке в обратном направлении, многие могут столкнуться с трудностями. Сегодня мы будем загружать файл из ресурсов приложения на apache сервер методом POST.
Предположим что у нас в ресурсах находится изображения, которое необходимо загрузить на сервер.
Серверная часть
Нам понадобится apache сервер. В DocumentRoot создадим 2 файла и одну папку. Файл index.php нужен только для тестирования работы серверной части из браузера. В этот файл пишем HTML код формы для отправки.
<form enctype="multipart/form-data" action="uploader.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="100000" /> Choose a file to upload: <input name="uploadedfile" type="file" /> <br /> <input type="submit" value="Upload File" /> </form>
Второй файл будет отвечать за прием изображения. Записать принятое изображение он должен в папку uploads. Ее нужно создать и правильно задать права на запись. Скрипт, отвечающий за прием файлов uploader.php:
$target_path = "uploads/";
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
echo "The file ". basename( $_FILES['uploadedfile']['name']).
" has been uploaded";
} else{
echo "There was an error uploading the file, please try again!";
}
В случае возникновения ошибки, скрипт вернет сообщение “There was an error uploading the file, please try again!”. Работу сервера проверяем при помощи браузера. Вызываем скрипт index.php и в форму добавляем небольшой файл. После того как форма будет отправлена, файл должен быть загружен в папку uploads.
Клиентская часть
Для начала необходимо
Статья полностью »














