Nano Hash - криптовалюты, майнинг, программирование

рисовать отдельно в 2-х пользовательских представлениях в одном классе

В IB поместите 2 пользовательских вида в одно окно. Я не вижу никакого способа дать им отдельные имена. В Inspector-Info мне пришлось использовать одно и то же имя, имя класса, для обоих из них в раскрывающемся меню. Я старался

DrawRect:  NSRect bounds = [self bounds];       
[[NSColor greenColor] set]; 
[NSBezierPath fillRect:bounds];

который заполнил оба пользовательских представления зеленым цветом. Но я хотел бы заполнять, рисовать и т. д. независимо в каждом пользовательском представлении. Как я могу обращаться к каждому представлению отдельно? Несколько пользовательских представлений позже. Или для Cocoa требуется только одно представление на класс?

Это, вероятно, тривиально, но Google и список подобных вопросов здесь не придумали ничего близкого. Там много о нескольких контроллерах представления, но мне не нужно переключать представления.


  • Похоже, вы изучаете программирование Cocoa, обучаясь сами? Я думаю, вам следует прочитать подходящую книгу по этому вопросу или следовать документации Apple. 07.11.2012

Ответы:


1

IB покажет вам имена классов, которые вы можете присвоить объекту. Если у вас есть только один пользовательский класс (например, «myCustomClass»), он будет отображаться только в раскрывающемся меню.

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

//Add this to your interface
NSNumber *myColor;

//Add/Edit the following functions
- (void)drawRect:(NSRect)aRect
{
    //Some code...
    if ([myColor intValue]) [self drawGreen];
    else [self drawRed];
    //Some code...
}

- (void)drawGreen
{
    NSRect bounds = [self bounds];       
    [[NSColor greenColor] set]; 
    [NSBezierPath fillRect:bounds];
}

- (void)drawRed
{
    NSRect bounds = [self bounds];       
    [[NSColor redColor] set]; 
    [NSBezierPath fillRect:bounds];
}

- (void)drawRedOrGreen:(int)aColor
{
    myColor = [NSNumber numberWithInt:aColor];
}

Вы должны добавить следующие две строки в интерфейс вашего контроллера

    IBOutlet myCustomClass *customView1;
    IBOutlet myCustomClass *customView2;

И вы должны установить цвет каждого представления. Это установит его при первой загрузке.

- (void)awakeFromNib
{
    [customView1 drawRedOrGreen:1]; //Green
    [customView2 drawRedOrGreen:0]; //Red
}

Таким образом, каждый вид будет окрашен по-разному.

Альтернативным решением было бы создание двух отдельных пользовательских классов (например, "myCustomClass1" и "myCustomClass2"), у которых был бы свой собственный код рисования...

07.11.2012
  • Спасибо, но я думаю, что недостаточно ясно объяснил: проблема в том, чтобы рисовать красные вещи в одном представлении и зеленые вещи в другом представлении, а не рисовать один набор или другой в обоих представлениях, что и делает код выше получится. aRect будет обращаться к обоим пользовательским представлениям в myCustomClass, на что вы указываете в раскрывающемся меню. (новый абзац) Я не вижу способа индивидуально обращаться к каждому пользовательскому представлению. Как бы вы использовали IB Outlets? (новый абзац) Боюсь, что Cocoa разрешает только одно пользовательское представление для каждого класса. 08.11.2012
  • Пожалуйста, простите мою неуклюжесть в добавлении комментариев. Я пробовал 2 пробела-возврат, чтобы получить новые строки, и дважды нажимая клавишу Escape, чтобы получить новые абзацы. Вместо этого веб-сайт принял мои правки, а затем я попытался их исправить. 08.11.2012
  • В одном код должен отрисовываться только зеленым цветом, а в другом красным. Кажется, я понял, о чем вы говорите, с первого раза. Я отредактировал код, чтобы он лучше описывал мое решение, возможно, теперь вы поймете, о чем я говорю. 08.11.2012
  • Я нашел время, чтобы привести вас в пример. dl.dropbox.com/u/4556129/Stack%20Overflow/ColoredViewsDemo. заархивировать 08.11.2012
  • Ух ты! Это было быстро. Большое спасибо. Я попытался скомпилировать и столкнулся с некоторыми ошибками. Я думаю, что вы кодировали в Xcode 4, а я использую Xcode 3.3, поэтому я создал новый проект и перетащил в него файлы .h и .m. (Раньше это работало.) В данный момент я борюсь с @synthesize NSNumber *_myColor;---ожидаемый ; перед * токен. @property (сильное) NSNumber *myColor; пришлось заменить на (копировать). Более скоро. Меня это беспокоит, потому что я не вижу способа связать каждое пользовательское представление с его экземпляром в IB, только с классом. 09.11.2012
  • Здесь я попытался сделать версию, совместимую с XCode 3.3, dl.dropbox.com/ u/4556129/Стек%20Переполнение/ 09.11.2012
  • Он работает! Это очень четко и красиво сделано. Вы очень хорошо ответили на мой вопрос о том, как обращаться с каждым пользовательским представлением индивидуально. Я не смог найти ответ нигде в течение многих часов поиска. Большое спасибо; вы самый полезный ответчик, которого я видел на любом из онлайн-форумов. (par) Пара незначительных замечаний: я внес несколько изменений в 3.3 Project Settings (если хотите, я могу прислать подробности), и я удивлен, что вы начинаете с NSDocument, а не с NSObject (почему?). 10.11.2012
  • Конечно, опубликуйте ссылку, чтобы будущие читатели могли увидеть, как вы ее решили. Я начал с NSDocument, потому что это класс контроллера по умолчанию в Xcode 4, и, честно говоря, не имеет значения, какой класс контроллера. (NSDocument добавляет поведение сохранения по умолчанию в вашу программу, вот и все) 10.11.2012
  • Ах. Контроллер по умолчанию: еще одно отличие при возврате к Xcode 3.3. Незначительные исправления были связаны с использованием OSX 10.6, а не 10.8. 10.11.2012
  • (время вышло, вот остальное) Для исправления ошибок и предупреждений в Project›Edit Project Settings›Build: 1.Base SDK, macosx до 10.6. 2. Ищем 10.8, меняем на 10.6. 3. Он работает с предупреждениями Wuninitialized..., но для очистки найдите Uninitialized Automatic Variables и снимите флажок. 10.11.2012
  • Вы используете if ([sender tag] == 1) в начале. Как найти тег # для пользовательского представления в IB? (Я думаю о нескольких представлениях.) После выбора одного я не нашел его номер тега в Инспекторе. В гугле тоже не нашел помощи. 12.11.2012
  • Ой! Я только что понял, что вы смотрите на номер тега кнопки. И, конечно же, вы можете видеть на экране, какая кнопка находится поверх какого пользовательского вида. 12.11.2012
  • Поэкспериментировав, я поместил оператор NSLog в конец drawRect. Похоже, что drawRect устанавливает цвета в обоих пользовательских представлениях несколько раз, сначала и после каждого переключения. Любая идея, почему это было бы? Я видел, что в других программах drawRect делает свое дело только один раз.- (void)drawRect:(NSRect)dirtyRect { int j=[myColor intValue]; если (j) [самостоятельно нарисовать зеленый]; еще [сам нарисовал красный]; количество++; NSLog(@myColor = %i,j); } 14.11.2012
  • Поскольку представление перерисовывается, когда вы нажимаете кнопку, когда кнопка анимируется, и после завершения анимации + я вручную говорю ему обновить все представление с помощью setNeedsDisplay:. Если вы посмотрите на функцию отрисовки в представлении, то заметите, что она выглядит примерно так: drawRect:(NSRect)dirtyRect: dirtyRect означает, что функция отрисовки не отрисовывает весь вид, а только измененную часть, чтобы сохранить память и вычислительная мощность. Если бы вы переместили кнопки за пределы представлений, то он вызвал бы drawRect только один раз. 14.11.2012
  • Да, действительно, перемещая кнопки за пределы пользовательских представлений, он вызывает drawRect только один раз, как и ожидалось, как при запуске, так и после нажатия кнопок. Но с кнопками поверх пользовательских представлений кажется, что система некоторое время последовательно вызывает draw rect, пока каким-то образом не переходит в состояние ожидания, как при запуске, так и после нажатия кнопок. 15.11.2012
  • кажется, что система вызывает draw rect последовательно какое-то время, потому что она вызывает drawRect: когда отрисовываются кнопки, когда отрисовывается окно, когда отрисовывается другое представление, и оно отрисовывает себя. По сути, представление будет вызывать drawRect всякий раз, когда что-то в контакте с ним изменяется. 15.11.2012
  • В очередной раз благодарим за помощь. В качестве небольшого знака признательности я хотел бы отправить вам исправленную версию программы, в которой есть небольшие изменения и добавлен текст. Свяжитесь со мной по моему опубликованному адресу электронной почты [email protected]. Ваш большой вклад в мой прогресс был IBOutlets в пользовательских представлениях. Я понятия не имел, что они существуют и предоставляют средства контроля над ними. 15.12.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..