Showing posts with label ios. Show all posts
Showing posts with label ios. Show all posts

Saturday, February 9, 2013

kissXML http://www.cyberforum.ru/objective-c/thread625924.html




kissXML example
NSData *xmlData;//откуда то данные в формате xml
DDXMLDocument *xmlDoc = [[DDXMLDocument alloc] initWithData:xmlData options:0 error:&error];
if (error || !xmlLib) {
   [xmlDoc release];
   /*обработка ошибки*/
} 
NSArray *items = [xmlDoc nodesForXPath:@"//a" error:&error];
for (DDXMLElement *item in items) {
     Page *page = [[Page alloc] init];
     NSString *imageURL = [[item attributeForName:@"key1"] stringValue];
     if ([[item attributeForName:@"some_attr"] stringValue]) {
        [self proceedKaraokeDDXMLElement:item forPage:page];
     }
     /*Делаем чтото с page*/
}

Thursday, January 24, 2013

Как использовать пользовательскую графику UIButton в приложениях на iPhone

Как использовать пользовательскую графику UIButton в приложениях на iPhone

Опубликовано 6 апреля 2012, 10:55 в разделе Руководства
Любой, кто знаком с Xcode, возможно, оценит глубину и широту библиотеки Cocoa Touch. Данный набор для разработки мобильных приложений включает заранее подготовленные компоненты для любого функционала iOS (поля ввода, переключатели, слайдеры и, конечно же, кнопки).

В данном руководстве мы хотели бы показать вам простой способ создания собственной графики для кнопок. Мы будем использовать последний выпуск Xcode 4.2, и займемся разработкой приложения в iOS5. Вам не нужно будет уметь разрабатывать на Objective-C, и это вряд ли помешает процессу разработки. При разработке iPhone-приложений вам придется сталкиваться с кодом, поэтому стоит немого подучить нужные технологии.

Выбираем кнопки

Для начала нам нужно найти отличные графические элементы, которые мы будем использовать в нашем приложении. Существует множество веб-сайтов с бесплатностями, на которых дизайнеры выкладывают собственные эксперименты. Давайте обратимся за помощью к 365psd, где, как нам кажется, предложены лучшие PSD-проекты для дизайнеров мобильных приложений.

Если у вас есть дизайнерские навыки, и вы можете собственноручно создать графику для кнопок, то не тяните, приступайте! Наше руководство сосредоточено на Xcode, и именно поэтому мы используем заранее подготовленную графику, дабы сэкономить время. Мы рекомендуем вам использовать векторные графические элементы. Они должны быть минимум годными для дисплеев типа Retina, где разрешение графики требуется в два раза больше.

Как использовать пользовательскую графику UIButton в приложениях на iPhone

Мы будем работать с кнопками Cloudy UI, созданными Себастьяном Габриэлем (Sebastien Gabriel). Мы удалили весь текст с плашек и масштабировали их, создали два разных разрешения (стандартное и для дисплеев формата Retina). Мы также создали два набора кнопок: один обычный и один с подсветкой, чтобы создать анимационный эффект при нажатии. В итоге у нас получилось 4 файла, которые вы можете скачать здесь.

Создаем новый проект

Сейчас было бы отлично, если вы уже знакомы с тем, как создавать новый проект в Xcode. Но, дабы освежить память, перейдите в меню File -> New -> New Project. Далее из шаблонов выбирайте Single View Application. Затем задайте имя вашего приложения и идентификатор узла. Здесь нам не нужна панель истории, вне зависимости от того, будете ли вы использовать файлы формата .xib или нет, но мы советуем вам пока что оставить этот пункт активным.

С левой стороны вашего навигатора по проекту вы сможете видеть папку под названием «Supporting Files». Сюда вам нужно перетащить ваши 4 изображения кнопок. Учтите, что каждая из кнопок должна быть названа соответствующим образом, по правилам Apple Developer. Мы использовали следующие имена:

* Button.png
* Button@2x.png
* ButtonHighlighted.png
* ButtonHighlighted@2x.png

При импорте файлов, не забудьте выделить пункт «Create groups for any added folders». Нажмите «Finish» и, если потребуется, отсортируйте ваши файлы.

Разработка кода для контроллера просмотра

Вероятно, вы заметили, что в нашем навигаторе по проекту всего несколько файлов. Выберите ViewController.m и взгляните на функцию viewDidload. Именно здесь мы будем устанавливать кнопки и настраивать их.

// creating custom button properties  UIFont *buttonFont = [UIFont fontWithName:@"Noteworthy-Bold" size:17.0];  UIColor *buttonColorDefault = [UIColor colorWithRed:90.0f/255.0f green:90.0f/255.0f blue:90.0f/255.0f alpha:1.0];  UIColor *buttonColorHighlight = [UIColor colorWithRed:255.0f/255.0f green:255.0f/255.0f blue:255.0f/255.0f alpha:1.0];    UIImage *btn = [UIImage imageNamed:@"Button.png"];  UIImage *btnh = [UIImage imageNamed:@"ButtonHighlighted.png"];

Для начала мы включили несколько переменных, которые мы будем использовать для стилизации наших кнопок. Мы также создали две новые переменные, которые будут содержать в себе тип данных UIImage для двух положений кнопок (обычное положение и положение при нажатии). Учтите, что нам не нужно указывать изображения @2x, предназначенные для дисплеев Retina, так как компилятор iOS автоматически распознает их и отображает.

Пользовательские параметры кнопок

Если вы не отстаете от нас, то давайте уже скорее перейдем к разработке кода для кнопок. Для этого нам потребуется создать новый UIButton и настроить параметр buttonWithType на UIButtonTypeCustom. После этого мы сможем добавлять другие настройки и оформление.

// building the buttons  UIButton *aboutBtn = [UIButton buttonWithType:UIButtonTypeCustom];  [aboutBtn addTarget:self action:@selector(showAboutPage) forControlEvents:UIControlEventTouchUpInside];  [aboutBtn setTitle:@"About Me" forState:UIControlStateNormal];  [aboutBtn setFrame:CGRectMake(80.0, 120.0, 162.0, 42.0)];  [aboutBtn setBackgroundImage:btn forState:UIControlStateNormal];  [aboutBtn setBackgroundImage:btnh forState:UIControlStateHighlighted];    [aboutBtn.titleLabel setFont:buttonFont];  [aboutBtn setTitleColor:buttonColorDefault forState:UIControlStateNormal];  [aboutBtn setTitleColor:buttonColorHighlight forState:UIControlStateHighlighted];

Вы можете выделить основные параметры в данном отрывке кода. Шрифты кнопок и параметр backgroundImage используют заранее встроенные переменные, которые мы упоминали в первом отрывке кода. Функция CGRectMake может немного смущать, если вы не знакомы с синтаксисом.

Таким образом мы создаем объект с заранее определенными параметрами ширины, высоты и координат X/Y. Нашей первой кнопкой будет «About Me», и она будет вызывать функцию пустого селектора под названием showAboutPage. Мы внесли этот код сразу после нашего метода viewDidLoad() (ниже приведена копия).

- (void)showAboutPage  {      // use this method to display your about page      // only when the button is tapped and released  }

Отображение UIButton

Если вы запустите приложение прямо сейчас, то ничего не увидите. Наша кнопка уже готова и оформлена, но нам потребуется еще одна последняя строка кода. После всего кода с настройками кнопки (но не выходя за пределы viewDidLoad) добавьте следующий код:

// place the button into the view  [self.view addSubview:aboutBtn];

Таким образом, мы задействуем метод CGRectMake для создания и отображения нашей кнопки с определенными размерами и координатами расположения на экране. Теперь компилируйте приложение, и тогда вы сможете увидеть нашу первую кнопку! Вы даже можете нажать на нее и проверить эффект при нажатии (но не забывайте, что функция обратного вызова еще не задействована). Вам нужно будет отредактировать функцию showAboutPage, которую мы создали ранее, которая переносила бы нас на новый элемент окна просмотра. Либо вы можете задействовать функцию по вашему личному предпочтению.

Если вы считаете, что все уже поняли, то можете просто копировать и вставлять код первой кнопки, чтобы создавать последующие. Помните, что вам нужно будет поменять координаты функции CGRectMake(), чтобы передвинуть новую кнопку либо вверх, либо вниз, чтобы она не заслоняла предыдущую. Вам также нужно будет придумать новое имя переменной (нельзя второй раз использовать aboutBtn).

Если же вы не совсем поняли процесс, то не стесняйтесь этого. Xcode – сложная штука, и требует довольно много практики. Скачивайте наши исходные файлы примера, приведенные ниже, и попытайтесь сравнить собственный проект с нашим.

Исходные файлы
Внимание! У вас нет прав для просмотра скрытого текста.


Как использовать пользовательскую графику UIButton в приложениях на iPhone

Завершение

Для всех, кто заинтересован в разработке приложений на iPhone, это руководство должно быть полезным. Изучение процесса разработки элементов пользовательского интерфейса в системе iOS – это, на сегодняшний день, очень перспективное увлечение.

Не говоря уже о том, что Xcode предлагает превосходный IDE для разработки кода на Objective-C. Вы можете поискать в Google несколько подобных бесплатных примеров (не обязательно только кнопки). Талантливые дизайнеры очень часто предлагают бесплатные полноценные наборы интерфейсов! Если у вас есть какие-либо идеи или вопросы касательно нашего сегодняшнего руководства, не стесняйтесь высказаться в комментариях!

Когда можно использовать UIButton вместо UIImageView

http://habrahabr.ru/post/63336/

Когда можно использовать UIButton вместо UIImageView

Этот пост, как и предыдущий, написан по мотивам тех псевдорешений, которые можно обнаружить на форумах по программированию под iPhone. Вот тут парни бились с проблемой отслеживания клика для UIImageView. Примечательно, что наилучшее решение, которое они нашли — это 10 или 20 раз в секунду проверять состояние «кнопок». На логичный вопрос одного из участников треда, почему-бы не поюзать UIButton вместо этого, последовал ответ, что, мол, мешает граница кнопки. Ну, скажем прямо, плохому танцору и не только это может помешать.
На самом деле, если вам захотелось использовать кастомное изображение в качестве кнопки существует довольно простой, но неочевидный способ. Заключается он в том, чтобы создать кнопку со специально выставленным buttonType в UIButtonTypeCustom.

UIButton *imageButton = [UIButton buttonWithType:UIButtonTypeCustom];
imageButton.frame = CGRectMake(0, 0, 75, 75);
[imageButton addTarget:self action:@selector(imageButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
[imageButton setImage:[UIImage imageNamed:@"button.png"] forState:UIControlStateNormal];
[self.view addSubview:imageButton];


После этого фреймворк даже при щелчке услужливо нарисует поверх изображения оверлей визуализируя прикосновение к кнопке. Опять-таки, все довольно просто, когда идешь по правильной тропинке. Оставайтесь на связи.

Tuesday, January 15, 2013

UISegmentedControl элемент управления http://src-code.net/elementy-upravleniya-iphone/

http://src-code.net/elementy-upravleniya-iphone/

UISegmentedControl элемент управления


Элементы управления (controls)— это разнообразные служебные классы, созданные для расширения возможностей пользовательского интерфейса приложений. UIKit поддерживает множество различных типов элементов управления. Некоторые из них являются весьма характерными для определенных приложений (например. UlScrubberControl), в то время как другие достаточно глубоко скрыты внутри классов более высокого уровня, которые не требуется использовать напрямую большинству разработчиков (например. UI Remo veCon t г о 1).
Элементы управления, используемые в iPhone, существенно отличаются от используемых в настольных приложениях. Элементы управления настольных систем, например, флажки и переключатели, просто не будут помещаться на устройстве с высоким разрешением и ограниченной точностью сенсорного экрана (т. е. без пера). Для каждого используемого элемента управления настольных систем был создан отдельный элемент управления для iPhone.
Элементы управления — это практическое расширение классов, порожденных от UlTableCell, особенно ячейки таблицы, ячейки таблицы предпочтений и другие подобные классы. Некоторые также могут быть использованы с панелями навигации и объектами других типов. Существуют три компактных элемента управления общего назначения для большинства приложений. Они будут описаны в этом разделе. Другие объекты наподобие элементов управления, например, индикаторы прогресса и выборщики, отдельно рассмотрены в соответствующих разделах этой главы.
Элементы управления порождены от базового класса uicontrol, который в свою очередь порожден от класса uiview. Это означает, что он обладает множеством таких же свойств, как и другие классы вида, с которыми вы уже познакомились. Элементы управления инициализируются с областью вида и ведут себя по большей части так же, как и объекты uiview.
Сегментированные элементы управления
Сегментированные элементы управления (segmented controls) заменяют переключатели из настольных операционных систем, а вместо них предоставляют интерфейс, схожий с тем, который имеется на передней панели посудомоечной машины. Пользователь видит панель инструментов, на которой нажатие одной кнопки приводит к поднятию всех остальных. Сегментированные элементы управления полезны при ограниченном количестве связанных вариантов выбора, доступных для одного элемента.
Создание элемента управления
Сегментированный элемент управления инициализируется с областью вида. Координаты фрейма это смещение вида, хранящего данный элемент управления, являющийся обычно таблицей предпочтений или панелью навигации:
UISegmentedControl *segCtl = ( [UlSegmentedControl alloc] initwithFrame:CGRectMake(70.0, 8.0, 180.0, 30.0) withStyle: 0 withltems: NULL ];
В зависимости от того, где используются элементы управления, можно выбрать один из трех различных стилей сегментированного элемента управления (табл. 7.1).
Таблица 7.1
Стиль
Описание
0
Большие белые кнопки с серой границей, подходит для ячеек предпочтений
1
Большие белые кнопки с черной границей, подходит для ячеек таблицы
2
Маленькие серые кнопки, подходит для панелей навигации
Каждый сегмент в пределах сегментированного вида представлен кнопкой, содержащей метку или изображение. Для каждого возможного варианта выбора должен быть создан отдельный сегмент. Сегментов может быть столько, сколько поместится на экране, но в один момент времени пользователь может выбрать только один сегмент. Варианты выбора для элемента управления "mood" могут выглядеть так, как в приведенном далее фрагменте кода: [ segCtl insertSegment:0 withTitle:@"Happy" animated: YES ]; [ segCtl insertSegment:1 withTitle:@"Sad" animated: YES ]; [ segCtl insertSegment:2 withTitle:@"Mad" animated: YES ];
Данный код добавляет на сегментированный элемент управления три кнопки: Happy. Sad и Mad. Каждой кнопке присваивается ее собственный номер сегмента: 0, 1,2.
Сегменты могут быть удалены.
Чтобы удалить какой-либо отдельный сегмент, воспользуйтесь методом
removeSegmentAtIndex:
t segCtl removeSegmentAtIndex: 0 animated: YES ];
Чтобы удалить все сегменты за раз. вызовите метод removeAHSegments. Это приведет к тому, что элемент управления скроет свои кнопки:
[ segCtl removeAllSegments ];
Если когда-либо понадобится изменить заголовок какой-либо кнопки, воспользуйтесь методом setTitle:
[ segCtl setTitle:@"Glad" forSegmentAtIndex: 0 ];
Изображения
Помимо текста сегментированные элементы управления могут также содержать на кнопках изображения. Любые используемые изображения должны храниться в программной папке приложения, как это обсуждалось в главе 2. Изображение может быть добавлено к существующему сегменту с помощью метода set Image:
[ segCtl setlmage: [ Ullmage applicationlmageNamed:@"happy.png" ] forSegmentAt Index: 0
];
Или же, если сегмент еще не был добавлен, другая версия метода insertSegment позволит указать изображение после добавления сегмента:
[ segCtl insertSegment: О
withlmage: [ Ullmage applicationNames:@"happy.png" ] animated: YES
];
Сам по себе элемент управления ничего не делает относительно того, что касается масштабирования изображения, поэтому он попытается отобразить ваше изображение на кнопке,; даже в том случае, если это изображение слишком велико. Поэтому нужно аккуратно разрабатывать изображения, чтобы они помещались на кнопке.
Мгновенные щелчки
По умолчанию сегментированный элемент управления позволяет пользователю выбирать один вариант за раз и удерживать эту кнопку нажатой до тех пор, пока не будет выбран другой вариант. Такое поведение можно немного поменять на автоматическое отпускание кнопки сразу же после ее нажатия. Для реализации данного поведения воспользуйтесь методом setMomentary: [ segCtl setMomentary: YES ];
Отображение элемента управления
После того как элемент управления будет настроен, его можно отобразить путем добавления в подвид к объекту любого типа, который сможет его принять. Такими объектами могут стать ячейки таблицы, панели навигации и другие объекты вида:
[ parentView addSubview: segCtl ];
Считывание элемента управления
Чтобы прочитать текущее значение сегментированного элемента управления, воспользуйтесь методом selectedSegment. Этот метод возвращает целое число, соответствующее номеру сегмента, выделенному на текущий момент. Данное значение основано на числе, присвоенном ему, когда он впервые был вставлен в элемент управления: int х = [ segCtl selectedSegmentlndex ];
Простого считывания значения элемента управления будет вполне достаточно для большинства случаев, например, как при работе с таблицами предпоч- ений, которым необходимо считывать его, только когда пользователь ухо- .ит со страницы. В некоторых же случаях при нажатии кнопки необходимо оправлять уведомление.
.ля такой дополнительной функциональности создайте подкласс : SegmentedControl И подмените методы mouseDown ИЛИ mouseUp вашего •лемента управления (в зависимости от того, когда вы хотите получать > -едомление). Эти события можно использовать для инициирования чтения г in любого другого необходимого действия в момент нажатия кнопки. Вот
аблон для этого: !. .terface MySegmentedControl : UlSegmentedControl
-   (void)mouseDown:(struct _ _GSEvent *)event;
-   (void)mouseUp:(struct _ _GSEvent *)event; @end
Теперь подмените метод mouseDown или метод mouseup так, чтобы значение можно было читать тогда, когда кнопка в этом классе нажата или отпущена:
@implementation MySegmentedControl
-   (void)mouseDown:(struct GSEvent *)event { int x = [ self selectedSegment ];
/* Здесь что-нибудь сделайте */
}
@end
Переключающий элемент управления
'Гак же, как сегментированный элемент управления заменяет переключатель, переключающий элемент управления (switch control) заменяет флажок. Переключающие элементы управления используются в панелях предпочтений для включения или выключения каких-либо возможностей.
Переключающий элемент управления значительно проще в использовании, но, тем не менее, может быть настроен до определенной степени.
Создание элемента управления
Переключающий элемент управления инициализируется с помощью стандартного метода initwithFrame. Данный метод определяет его размер и координаты относительно принимающего класса, например, ячейки таблицы или панели навигации:
UlSwitchControl *switchControl = [ [ UlSwitchControl alloc ] initwithFrame: CGRectMake(170.Of, 5.Of, 120.Of, 30.Of)
] ;
Если такой переключатель является достаточно опасным и может повлиять на быстродействие системы или же послужить причиной других серьезных последствий, то лучше пометить его предупреждающими цветами. Можно заставить объект UlSwitchControl использовать альтернативный набор цветов, отображаться при активации в ярко-оранжевом цвете.
Для этого воспользуйтесь при создании элемента управления методом
setAlternateColors:
[ switchControl setAlternateColors: YES ];
Отображение элемента управления
После создания и инициализации элемента управления его можно отобразить, добавив его к объекту вида, например, ячейке таблицы или панели навигации:
[ tableCell addSubview: switchCtl ];
Считывание элемента управления
Переключающий элемент управления возвращает значение с плавающей запятой 0,0, если он выключен, и ненулевое значение, если он включен. Это значаение можно получить путем вызова метода value данного объекта:
float switchValue = [ switchControl value ];
Большинству приложений необходимо считывать переключающее значение при уходе со страницы, например, в таблицах предпочтений. Чтобы считать значение такого элемента управления в момент его переключения, нужно перехватить его событие mouseDown или mouseup. Чтобы подменить эти методы, унаследуйте uiswitchcontroi. Например:
@interface MySwitchControl : UlSwitchControl {
}
-   (void)mouseUp:(struct ____ SSEvent *)event;
@end
Когда такой элемент управления переключается, уведомляется метод mouseup, позволяя тем самым мгновенно предпринять какое-либо действие:
@implementation UIMySwitchControl
-   (void)mouseUp:(struct _ j3SEvent *)event { [ super mouseUp: event];
float switchValue = [ self value ]; /* Здесь что-нибудь сделайте */
}
@end
Источник: Здзиарски Дж. iPhone. Разработка приложений с открытым кодом: Пер„с англ. — 2-е изд., перераб. и доп. — СПб.: БХВ-Петербург, 2009. — 368 е.: ил.

Friday, January 11, 2013

ios - Фильтрация UITableView c данными из списка .plist http://hashcode.ru/questions/134192/ios-фильтрация-uitableview-c-данными-из-списка-plist

  http://hashcode.ru/questions/134192/ios-фильтрация-uitableview-c-данными-из-списка-plist

ios - Фильтрация UITableView c данными из списка .plist

Есть таблица, заполняется она из списка *.plist, который основан на словарях (NSDictionary),
примерно такого формата:
  <array>  
    <dict>  
          <key>name</key>  
        <string>Example1</string>  
          <key>type</key>  
        <string>1</string>  
      </dict>
    <dict>  
        <key>name</key>  
          <string>Example2</string>  
        <key>type</key>  
          <string>2</string>  
    </dict>    
  
  Вопрос: можно ли при нажатии на одну из кнопок UISegmentedControl, отфильтровывать
таблицу и выводить только данные с типом "1"?
П.С.: с выводом всех данных из списка проблем нет.

Ну и в качестве добавления к лаконичному "конечно можно@aknew, покажу, каким ещё способом это можно сделать:
  NSArray *array; // массив, полученный из plist'a
  NSString *type = @"1"; 
  NSArray *result = [array filteredArrayUsingPredicate: 
                             [NSPredicate predicateWithFormat:@"(type == %@)",  type]];
  
(iOS 3.0+, OS X 10.4+)

Хотя лично я бы заранее распихал по отдельным массивам объекты с разными типами - так должно быть быстрее, чем вытаскивать их каждый раз из одного общего.

Tuesday, January 8, 2013

Массивы в Objective-C. NSArray и NSMutableArray http://idev.by/ios/843/

http://idev.by/ios/843/

Массивы в Objective-C. NSArray и NSMutableArray

АВТОР  
/  /

Массивы в Objective-C

В этой статье мы поговорим о массивах. В Objective-C массивы чаще всего реализуются с помощью классов NSArray и NSMutableArray. Класс NSMutableArray, в отличие от NSArray, позволяет произвольно изменять порядок элементов, создавать и удалять новые элементы.
Для вывода результатов будем использовать функцию NSLog(), с которой мы успели поработать в предыдущей статье про NSString. Консоль можно увидеть внизу окна XCode при запуске приложения. Если консоль не открывается, то выберите пункт меню View->Show Debug Area (⇧⌘Y).

Создание массива

Чтобы создать статичный массив с определенным набором элементов можно использовать следующий код:
  NSArray *array = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", nil];  NSLog(@"%@", array);
Здесь мы создаем массив с тремя элементами. Элементами являются объекты NSString — т.е. простые строки. Также можем воспользоваться методом initWithArray для создания массива из другого массива:
  NSArray *array = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", nil];  NSArray *newArray = [[NSArray alloc] initWithArray:array];  NSLog(@"%@", newArray);
Мы создали полную копию массива. Также мы можем создать массив из другого массива, но использую только часть элементов. Для этого воспользуемся методом subarrayWithRange:
  NSArray *array = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", nil];  NSRange range;  range.length = 2;  range.location = 0;  NSArray *newArray = [array subarrayWithRange:range];  NSLog(@"%@", newArray);
В результате мы получим новый массив, который состоит только из первых двух элементов. В следующем примере мы рассмотрим метод initWithContentsOfFile, который позволяет создать массив из файла:
  NSString *path = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"txt"];  NSError *error;  NSArray *array = [[NSArray alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];  NSLog(@"%@", array);
Этот метод может показаться вам знакомым по предыдущей статье про строки. Действительно оба класса содержат один и тот же метод, который позволяет создавать объекты с использованием данных, которые могут храниться в файлах. Еще один метод похожий по названию и действию — initWithContentsOfURL, позволяет создать массив использую URL:
  NSString *path = @"http://www.apple.com";  NSArray *array = [[NSArray alloc] initWithContentsOfURL:[NSURL URLWithString:path]];  NSLog(@"%@", array);
Не забудьте указать реальный URL, где будет располагаться ваш файл с данными для массива.

Получение данных из массива

В первую очередь рассмотрим простой и очень важный метод count, который позволяет получить количество элементов в массиве:
  NSArray *array = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", nil];  NSLog(@"%d", [array count]);
Результатом будет «3». Обратите внимание где мы используем этот метод — непосредственно внутри функции NSLog. Далее рассмотрим пример с использование метода objectAtIndex:
  NSArray *array = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", nil];  NSLog(@"%@", [array objectAtIndex:0]);
Этот метод возвращает элемент, который находится на заданном месте. В консоли будет выведен результат «one». Не забывайте что нумерация элементов начинается с нуля.

Поиск элементов в массиве

Самый простой метод поиска элемента в массиве — это containObject:
  NSArray *array = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", nil];  if ([array containsObject:@"one"]) {   NSLog(@"yes");  }  else {   NSLog(@"no");  }
Этот метод возвращает FALSE или TRUE в зависимости от того, присутствует или нет элемент внутри массива. В нашем примере на консоли должно появиться «yes». Далее рассмотрим более функциональные методы indexOfObject и indexOfObject:inRange:
  NSArray *array = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", nil];  NSLog(@"%d", [array indexOfObject:@"two"]);
и
  NSArray *array = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", nil];  NSRange range;  range.length = 2;  range.location = 0;  NSLog(@"%d", [array indexOfObject:@"two"inRange:range]);
Оба метода возвращают номер искомого элемента внутри массива. В первом и во втором примере мы ищем один и тот же элемент «two». Основное отличие заключается в том, что метод indexOfObject:inRange позволяет задать определенный диапазон элементов, где следует проводить поиск.

Сравнение массивов

Простой способ сравнить два массива между собой — использовать метод
  NSArray *array = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", nil];  NSArray *newArray = [[NSArray alloc] initWithObjects:@"one", @"two", nil];  if ([array isEqualToArray:newArray]) {   NSLog(@"yes");  }  else {   NSLog(@"no");  }
В консоли должен появиться результат «no» — наши массивы не идентичны друг другу.

Сортировка массивов

Пожалуй самые интересные методы представлены в этом разделе, так как основная задача массивов хранить большое количество элементов, а также дать возможность выбрать из этого массива необходимые данные. Один из способов добраться до необходимых элементов — сортировка. Так как в процессе сортировки расположение элементов в массиве должно изменяться — в наших примерах мы будем использовать массивы класса NSMutableArray. Самый просто способ отсортировать (например массив состоящий из набора чисел) — это использовать метод sortUsingSelector:
  NSMutableArray *marray = [[NSMutableArray alloc] init];  for (int i = 0 ; i < 10; i++) {   int newElement = random();   [marray addObject:[NSString stringWithFormat:@"%d",newElement]];  }  NSLog(@"%@", marray);  [marray sortUsingSelector:@selector(compare:)];  NSLog(@"%@", marray);
В цикле for мы наполняем массив случайными значениями (значения хранятся в объектах NSString) и выводим значения в консоль. Далее выполняем сортировку с помощью метода sortUsingSelector. В качестве аргумента мы указали @selector(compare:). Это означает что ортировка выполняется с помощью метода compare класса NSString - именно объекты этого класса мы сравниваем между друг другом. Тоже самое можно реализовать с помощью метода sortUsingDescriptors:
  NSMutableArray *marray = [[NSMutableArray alloc] init];  for (int i = 0 ; i < 10; i++) {   int newElement = random();   [marray addObject:[NSString stringWithFormat:@"%d",newElement]];  }  NSSortDescriptor* sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:nil ascending:NO selector:@selector(localizedCompare:)];  NSLog(@"%@", marray);  [marray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];  NSLog(@"%@", marray);
В данном примере мы задаем специальны дескриптор, который описывает процесс сортировки. Обратите внимание на то, что заменив «ascending:NO» на «ascending:YES», мы получим сортировку по убыванию.

Дополнительные возможности NSMutableArray

При создании массивов часто появляется необходимость добавить новый элемент или удалить ненужный. В этом нам помогут массивы NSMutableArray и их методы, которые позволяют модифицировать массивы «на лету». Инициализовать такой массив мы можем методами перечисленными выше а также можем создать массив без каких либо элементов:
  NSMutableArray *marray = [[NSMutableArray alloc] init];
Далее добавляем несколько элементов:
  for (int i = 0 ; i < 5; i++) {   [marray addObject:[NSString stringWithFormat:@"element #%d", i]];  }  NSLog(@"%@", marray);
В консоли мы увидим 5 пронумерованных элементов. Также с помощью метода insertObject:atIndex мы свободно можем добавить элемент в массив в любую позицию:
  [marray insertObject:@"element #X" atIndex:0];  NSLog(@"%@", marray);
В нашем массиве должен появится еще один элемент в самом начале. Еще востребованный способ добавить элементы в массив - использовать элементы другого массива с помощью метода addObjectsFromArray:
  NSArray *array = [[NSArray alloc] initWithObjects:@"one", @"two", @"three", nil];  NSMutableArray *marray = [[NSMutableArray alloc] init];  for (int i = 0 ; i < 5; i++) {   [marray addObject:[NSString stringWithFormat:@"element #%d", i]];  }  [marray insertObject:@"element #X" atIndex:0];  [marray addObjectsFromArray:array];  NSLog(@"%@", marray);
Удалить ненужные элементы можно с помощью нескольких методов. Например - удаляем последний элемент:
  NSMutableArray *marray = [[NSMutableArray alloc] init];  for (int i = 0 ; i < 5; i++) {   [marray addObject:[NSString stringWithFormat:@"element #%d", i]];  }  [marray removeLastObject];  NSLog(@"%@", marray);
На выходе получаем только четыре элемента из пяти добавленных. Свободно можем удалить элемент на любой позиции в массиве:
  [marray removeObjectAtIndex:0];
Какой-либо конкретный элемент:
  [marray removeObject:@"element #1"];
Или все элементы сразу:
  [marray removeAllObjects];
А также элементы в заданном диапазоне:
  NSMutableArray *marray = [[NSMutableArray alloc] init];  for (int i = 0 ; i < 5; i++) {   [marray addObject:[NSString stringWithFormat:@"element #%d", i]];  }  NSRange range;  range.length = 2;  range.location = 2;  [marray removeObjectsInRange:range];  NSLog(@"%@", marray);
Использование массивов в Objective-C дает большие возможности для хранения, записи, удаления и поиска нужных данных. В то же время работа с массивами не требует глубоких знаний в программировании, все методы простые и интуитивно понятные. Более детально с классами NSArray и NSMutableArray вы всегда можете ознакомится в документации.