Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.90
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
#1

Массивы (музыкальная программа) - Objective-C

16.04.2012, 11:39. Просмотров 3484. Ответов 44
Метки нет (Все метки)

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

Но остановился я на моменте забивания нажатых клавиш в массив. мне нужно как то объявить массив снаружи, а потом внутри действия нажатия каждой клавиши в него всякое добавлять последовательно, я попробовал insertObject atIndex не получается выводит пустой массив, сначала думал что проблема в переводе массива в строку и выводе, но потом понял что массив просто пустой, после некоторого колдовства обнаружил что если массив объявлять внутри IBAction{} то все нормально, в общем как то так, заранее спасибо)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 22:00  [ТС]     Массивы (музыкальная программа) #21
zulkis, я не xib использую у меня storyboard когда создавал проект не обратил внимание, да и думал разницы нету

Добавлено через 2 минуты
zulkis, все поменял, та же картина(

Добавлено через 6 минут
брейкпоинт зафиксировал пустой массив
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
17.04.2012, 22:01     Массивы (музыкальная программа) #22
Я со storyboard не работал, и разбираться сейчас не буду. Пойду спать.
Что там как вызывается при создании контроллера из сторибоарда не в курсе.
Проинициализируйте Ваш массив в viewdidload:
Objective-C
1
2
3
4
- (void)viewDidLoad {
  [super viewDidLoad];
  notesArray = [[NSMutableArray alloc] initWithCapacity:12];
}
Так должно все работать.
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 22:07  [ТС]     Массивы (музыкальная программа) #23
zulkis, спасибо огромное за столько полезных советов, реально я бы не справился сам, и кстати только что с viewDidLoad заработало!! Спасибо большое, спокойной ночи)
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
19.04.2012, 21:25  [ТС]     Массивы (музыкальная программа) #24
zulkis, прошу прощения за беспокойство, но возник вопрос, а точнее два, первый это есть ли метод для поиска строки в строке, ну типа найти "привет" в строке "привет как дела", и второй можно ли как то скинуть приложение на девайс, прошивка 5.0.1 джейл есть. икскод один из последних, метод с "Не подписывать приложение" через плист не работает
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
20.04.2012, 06:13     Массивы (музыкальная программа) #25
Есть классные методы hasSuffix и hasPrefix (проверяют является ли подстрока концом и началом строки соответственно)
А для конкретного нахождния подстроки можете использовать rangeOfString, а затем сравнивать полученный NSRange.location с NSNotFound. И если строка будет найдена, то в location будет номер первого символа, а length будет соответственно длина.

Читаем:
Немного про NSRange
Ну и найдите в доке описание rangeOfString, stringWithRange, hasPrefix, hasSuffix.
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
20.04.2012, 10:33  [ТС]     Массивы (музыкальная программа) #26
zulkis, хмм, почитал я про range и все с ним связанное, и понял что не правильно сформулировал вопрос, ну т.е я искал что-то на подобие bool containts только для строк, потому что в массиве у меня каждая цифра это элемент, а мне необходимо найти например 60813151 в этом массиве, рэйнджы возвращают диапазон, а я хочу чтобы просто 1 или 0
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
20.04.2012, 12:26     Массивы (музыкальная программа) #27
Сравните NSRange.location с NSNotFound
Типа:
Objective-C
1
2
3
4
NSRange range = [@"OLOLO" rangeOfString:@"LOL"];
        if (range.location != NSNotFound) {
            NSLog(@"LOL Found at %d", range.location);
        }
Или:
Objective-C
1
2
3
4
5
6
NSString *string = @"hello bla bla";
if ([string rangeOfString:@"bla"].location == NSNotFound) {
  NSLog(@"string does not contain bla");
} else {
  NSLog(@"string contains bla!");
}
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
20.04.2012, 22:19  [ТС]     Массивы (музыкальная программа) #28
zulkis, наверное последний вопрос, вы не знаете как заставить несколько звуков играться не вместе а друг за другом?
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
20.04.2012, 23:00     Массивы (музыкальная программа) #29
Ну вы можете создать очередь, а затем запускать воспроизведение звука из этой очереди с возведением запуска таймера на временной отрезок данного звука. При следующем срабатывании таймера вы запускаете следующий звук и снова включаете таймер.
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
21.04.2012, 08:43  [ТС]     Массивы (музыкальная программа) #30
zulkis, поковырялся я в примерах с таймером понял только то что таймером можно вызывать какое то действие т.е IBAction а мне нужно просто выполнять операции внутри if и в этом случае непонятно что писать в селектор например

Objective-C
1
(NSTimer *)timerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
if ([result rangeOfString:@"63143454"].location != NSNotFound) 
    {
        CFBundleRef mainBundle1 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef1;   
        soundFileURLRef1= CFBundleCopyResourceURL(mainBundle1, (CFStringRef) @"11650__techsetsu__grandmither-s-piano-31", CFSTR ("wav"), NULL);
        CFBundleRef mainBundle2 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef2;   
        soundFileURLRef2= CFBundleCopyResourceURL(mainBundle2, (CFStringRef) @"11644__techsetsu__grandmither-s-piano-25", CFSTR ("wav"), NULL);
        CFBundleRef mainBundle3 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef3;   
        soundFileURLRef3= CFBundleCopyResourceURL(mainBundle3, (CFStringRef) @"11646__techsetsu__grandmither-s-piano-27", CFSTR ("wav"), NULL);
        CFBundleRef mainBundle4 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef4;   
        soundFileURLRef4= CFBundleCopyResourceURL(mainBundle4, (CFStringRef) @"11648__techsetsu__grandmither-s-piano-29", CFSTR ("wav"), NULL);
        UInt32 soundID1;
        AudioServicesCreateSystemSoundID(soundFileURLRef1, &soundID1);
        AudioServicesPlaySystemSound(soundID1);
        UInt32 soundID2;
        AudioServicesCreateSystemSoundID(soundFileURLRef2, &soundID2);
        AudioServicesPlaySystemSound(soundID2);
        UInt32 soundID3;
        AudioServicesCreateSystemSoundID(soundFileURLRef3, &soundID3);
        AudioServicesPlaySystemSound(soundID3);
        UInt32 soundID4;
        AudioServicesCreateSystemSoundID(soundFileURLRef4, &soundID4);
        AudioServicesPlaySystemSound(soundID4);
        
    }
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
21.04.2012, 14:22     Массивы (музыкальная программа) #31
Вы в терминологии хоть подразберитесь немного. IBAction это просто указание Интерфейс Билдеру опознавать метод. Это обычный void. Как вызывать селектор я Вам не буду рассказывать, ибо это есть везде.
А то получается я за Вас Вашу задачу решаю.

Читайте, разбирайтесь.

Насчет
таймером можно вызывать какое то действие
Ну и вызывайте, кто Вам мешает. Еще и объект передайте как аргумент(Можно вообще передавать строчку(имя файла)).
Если не хотите работать(не понимаете) с таймером - пробуйте -performSelector:withObject:afterDelay:

PS. Без знания Основ языка и банальных конструкций, для выбранной задачи, Вы далеко не уедете. Это Вам не "Hello, world".
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
22.04.2012, 14:08  [ТС]     Массивы (музыкальная программа) #32
zulkis, может я конечно совсем глупый, но я не могу понять, во всех примерах что я нашел c performSelector:withObject:afterDelay: селектором является некая функция (void), вот один из них

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (void) methodCalledByButtonClick 
{
  for (id obj in array) {
    [self doSomethingWithObj:obj];
  }
}
 
static BOOL isBad = NO;
- (void) doSomethingWithObj:(id)obj {
  if (isBad) {
    return;
  }
  if ([obj isBad]) {
    isBad = YES;
    [self performSelector:@selector(resetIsBad) withObject:nil afterDelay:0.1];
    return;
  }
  //Do something with obj
}
 
- (void) resetIsBad {
  isBad = NO;
}
Ну я думаю ладно, возможно я поступаю слишком прямолинейно, пытаюсь сделать как в примере, внутри действия привязанного к кнопке воспроизведения 4х звуков, я создаю -(void)play; в заголовочном файле и пытаюсь использовать его внутри кнопки, но мне пишет что я использую "undeclaraited identifier", я совершенно запутался

Добавлено через 1 час 6 минут
вот единственное что нашел по селектору, из этого определения понятно не многое

Добавлено через 1 минуту
"Селектор — это строка, состоящая из идентификаторов, разделённых двоеточиями. Например, если вызов имеет вид:

[mycalendar ordinalityOfUnit:myunit inUnit:myunit2 forDate:mydate]

...то селектор этого вызова "ordinalityOfUnit:inUnit:forDate:". Непосредственно в objc_sendmsg передаётся не строка, а 32битное число. Каждая динамическая библиотека и сама программа при инициализации регистрируют все используемые селекторы, устанавливая соответствие между строками и числами."
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
22.04.2012, 14:33     Массивы (музыкальная программа) #33
И? Что неясно то именно?
Покажите Ваш код, а не тот0, что из примера.
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
22.04.2012, 20:21  [ТС]     Массивы (музыкальная программа) #34
zulkis,
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
if ([result rangeOfString:@"63143454"].location != NSNotFound) 
    {
        CFBundleRef mainBundle1 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef1;   
        soundFileURLRef1= CFBundleCopyResourceURL(mainBundle1, (CFStringRef) @"11650__techsetsu__grandmither-s-piano-31", CFSTR ("wav"), NULL);
        UInt32 soundID1;
        AudioServicesCreateSystemSoundID(soundFileURLRef1, &soundID1);
        AudioServicesPlaySystemSound(soundID1);
        
        CFBundleRef mainBundle2 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef2;   
        soundFileURLRef2= CFBundleCopyResourceURL(mainBundle2, (CFStringRef) @"11644__techsetsu__grandmither-s-piano-25", CFSTR ("wav"), NULL);
        UInt32 soundID2;
        [self performSelector:  withObject:nil afterDelay:];
        AudioServicesCreateSystemSoundID(soundFileURLRef2, &soundID2);
        AudioServicesPlaySystemSound(soundID2);
        
        CFBundleRef mainBundle3 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef3;   
        soundFileURLRef3= CFBundleCopyResourceURL(mainBundle3, (CFStringRef) @"11646__techsetsu__grandmither-s-piano-27", CFSTR ("wav"), NULL);
        UInt32 soundID3;
        AudioServicesCreateSystemSoundID(soundFileURLRef3, &soundID3);
        AudioServicesPlaySystemSound(soundID3);
        
        CFBundleRef mainBundle4 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef4;   
        soundFileURLRef4= CFBundleCopyResourceURL(mainBundle4, (CFStringRef) @"11648__techsetsu__grandmither-s-piano-29", CFSTR ("wav"), NULL);
       
        UInt32 soundID4;
        AudioServicesCreateSystemSoundID(soundFileURLRef4, &soundID4);
        AudioServicesPlaySystemSound(soundID4);
        
    }
}
насколько я понимаю мне нужно AudioServicesCreateSystemSoundID(soundFileURLRef2, &soundID2);
AudioServicesPlaySystemSound(soundID2); положить в void и этот void записать в performSelector
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
22.04.2012, 21:25     Массивы (музыкальная программа) #35
Нет, вы понимаете не правильно.
Цитата Сообщение от ktalonec Посмотреть сообщение
положить в void и этот void записать в performSelector
Читайте мат часть.
Читайте что такое void, что такое функции в Си и прочие основополагающие вещи. Лучше вместо гуглинга возьмите книжку и почитайте.
И ваши AudioServicesCreateSystemSoundID, etc функции - это функции C, никакие не селекторы.
Я бы рад помочь, но без принципиального понимания базовых принципов - я даже не знаю, что предложить.
Только - читайте, разбирайтесь, спрашивайте, если совсем непонятно.
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
22.04.2012, 21:35  [ТС]     Массивы (музыкальная программа) #36
zulkis, я знаю что такое воид, это функция не возвращающая значения, ну так откуда мне ее взять тут, просто сама структура не понятна, в примере что я выложил в качестве перформСелектора именно функция воид
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
22.04.2012, 22:03     Массивы (музыкальная программа) #37
void это НЕ функция.
Структура - создаете objC метод, внутри него пишете что вам там со звуками нужно делать, затем вызываете этот objC метод через performSelector.
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
23.04.2012, 09:56  [ТС]     Массивы (музыкальная программа) #38
zulkis, я понимаю что я уже достал, но я начал читать мануал который описывает все с нуля, там написано про методы, я все это прочитал сделал все по шаблону мне говорят undeclaired identifier на название моего метода, там про объявление метода ничего не сказано, вот я и думаю в чем проблема я понимаю что это азы, но где правда не знаю
Описание синтаксиса методов из мануала
Начнем с методов, синтакси которых в общем виде выглядит так:

- (ТипВозвращаемыхДанных)названиеМетодаТипДанных)агрумент1продолжениеНазванияМетодаТипДанных)аргумент2;

И реальный пример:

- (NSArray *)shipsAtPointCGPoint)bombLocation withDamageBOOL) damaged;

В данном случае представлен метод с двумя аргументами. Метод начинается с знака «-» для методов экземпляра класса или с «+» для методов класса. Подробнее об отличиях мы поговорим позже.

Далее идет тип возвращаемых значений, он может быть (void), если ничего не возвращается, или (id), если возвращается объект, при этом тип его может быть любым (NSString, NSArray, NSNumber, NSDictionary…). Однако рекомендуется по возможности явно указывать тип данных, для того, чтобы компилятор мог предупредить нас о возможной ошибке.

*Разрешается не писать тип возвращаемого значения и не ставить скобки в начале метода вообще, тогда это расценивается как (id). Также, когда мы указываем (IBAction), это аналогично (void), но при этом мы сообщаем Interface Builder, что этот метод будет вызван из интерфейса.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
23.04.2012, 11:41     Массивы (музыкальная программа) #39
Что конкретно Вы передаете в performSelector: и на какой конкретно метод выводит undeclared identifier?
Строчки кода пожалуйста.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2012, 12:10     Массивы (музыкальная программа)
Еще ссылки по теме:

Массивы и строки Objective-C
Ищу энтузиастов - музыкальная база
DigiClock и музыкальная шкатулка

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
23.04.2012, 12:10  [ТС]     Массивы (музыкальная программа) #40
zulkis, так дело в том что до перформСелектора дела пока не дошло, я делаю по шаблону
Шаблон
- (ТипВозвращаемыхДанных)названиеМетодаТипДанных)агрумент1продолжениеНазванияМетодаТипДанных)аргумент2;


вот так примерно
-(id)zvuk: (CFURLRef)ssylka peremennaya: (UInt32)soundObject;
Yandex
Объявления
23.04.2012, 12:10     Массивы (музыкальная программа)
Ответ Создать тему
Опции темы

Текущее время: 18:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru