2013-06-06 2 views
-4

Я новичок в разработке Mac. Я обновляю код рамки в Objective c. Я меняю код так.Возможно NSIndexSet для преобразования NSEnumerator?

NSEnumerator *e = (NSEnumerator *)[oOutlineView selectedRowIndexes]; 
    NSNumber *cur; 

    while ((cur = [e nextObject])) 
    { 
     CKDirectoryNode *node = [oOutlineView itemAtRow:[cur intValue]]; 
     [selection addObject:node]; 
     fullPath = [node path]; 
    } 

Где [oOutlineView selectedRowIndexes] предоставляет объект NSIndexSet. Я не могу запустить этот код, потому что цель - это фреймворк. Это прекрасно? Пожалуйста, помогите мне.

+0

Я знаю, что это плохой вопрос, но я хочу ответить на это. –

+1

Когда вы пишете Framework (IMHO), рекомендуется создать отдельную цель, которая создает приложение, которое ссылается на фреймворк. – Wevah

ответ

2

Нет, это не сработает. NSIndexSet не является перечислителем и не может использоваться как один. Чтобы перечислить один, вы можете использовать метод enumerateIndexesUsingBlock: или вы используете firstIndex и indexGreaterThanIndex:

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

+0

Спасибо Свену. Вы можете объяснить. потому что я не знаю больше о цели c. –

0

Нет, это не так: NSIndexSet не является подклассом NSEnumerator. Если вы хотите перечислить индексы в наборе индексов, см. this Apple documentation page и раздел «Наборы индексов и блоки» чуть ниже этого.

1

Вы не отбрасывают NSArray (не NSDictionrary, ни NSIndexSet, ни NSIndexPath), чтобы NSEnumerator итерировать их. (Возможно, вы имели обыкновение использовать .net много?)

В большинстве случаев (это не работает для NSIndexSet и NSIndexPath, хотя), вы просто:

for (id object in collection) 
{ 
    // ... 
} 

и компилятор генерирует соответствующий код для вас (даже быстрее, чем NSEnumerator! Это работает непосредственно на внутреннем состоянии коллекции.)

И поскольку ваша цель рамки (т.е. динамической библиотеки) вы должны либо

  • написать исполняемый файл или
  • блок записи тестов

, чтобы проверить это.

2

Моя проблема решена этим методом.

- (void) goThroughIndexSet:(NSIndexSet *) anIndexSet 
{ 
    NSUInteger idx = [anIndexSet firstIndex]; 

    while (idx != NSNotFound) 
    { 
     // do work with "idx" 
     NSLog (@"The current index is %u", idx); 

    // get the next index in the set 
    idx = [anIndexSet indexGreaterThanIndex:idx]; 
    } 

    // all done 
} 

Спасибо всем.

Смежные вопросы