Создавайте торговые точки и кодируйте программно в XCode - PullRequest
0 голосов
/ 11 августа 2011

Я нахожу очень утомительным создание подключений и других повторяющихся вещей в XCode 4. Это просто не кажется мне РАДНЫМ. Позвольте мне объяснить

У меня есть проект iPad на основе View с одним представлением. На вид около 50 кнопок и 50 объектов UIImage - всего 100 объектов. Все объекты UIImage имеют одинаковое изображение. Все кнопки имеют одинаковое действие. Тег каждой кнопки определяет код для запуска в действии.

Что я считаю утомительным:

  1. Я должен ввести «тег» для каждого из объектов - 100 тегов
  2. Мне нужно перетащить каждый объект, чтобы создать розетку, которая производит код, подобный этому, в файле .h:

    #import <UIKit/UIKit.h>
    @interface bbTestViewController : UIViewController {
        UIImageView *pop1;
        UIImageView *pop2;
        UIImageView *pop3;
        UIImageView *pop4;
        UIImageView *pop5;
        etc....
    

    для 50 элементов управления, а также приведенный ниже код:

    @property (nonatomic, retain) IBOutlet UIImageView *pop1;
    @property (nonatomic, retain) IBOutlet UIImageView *pop2;
    @property (nonatomic, retain) IBOutlet UIImageView *pop3;
    @property (nonatomic, retain) IBOutlet UIImageView *pop4;
    @property (nonatomic, retain) IBOutlet UIImageView *pop5;
    etc....
    

    для 50 элементов управления.

и в файле .m:

    @synthesize pop1;
    @synthesize pop2;
    @synthesize pop3;
    @synthesize pop4;
    @synthesize pop5;
    etc.....

Это также добавляет такие строки: - (void) viewDidUnload {

        [self setPop1:nil];
        [self setPop2:nil];
        [self setPop3:nil];
        [self setPop4:nil];
        [self setPop5:nil];
        etc.....

и

    - (void)dealloc {
        [pop1 release];
        [pop2 release];
        [pop3 release];
        [pop4 release];
        [pop5 release];
        etc.....

3. Затем для каждой из 50 кнопок я должен перетащить их в одно и то же действие, чтобы установить соединение, выбрать действие касания, ввести имя и нажать кнопку ОК.

Это я считаю утомительным и контрпродуктивным. Не RAD вообще. Больше САД. Столько повторять одни и те же действия, это больно.

Итак, вопрос в том, есть ли более простой способ. Я не верю в копирование / вставку, поэтому решение - нет-нет.

В других языках я бы использовал For ... Each, чтобы перебрать каждый объект и выполнить необходимое.

например. для тега: Я хотел бы иметь код для установки тегов, как это:

    Integer n = 1;
    For Each oObject in myView
        oObject.tag = n
        n = n+1
    end for

Так что я могу использовать код, чтобы обойти эти утомительные процессы

  1. бирка
  2. Объявление каждого объекта и добавление кода @property ... добавление кода @synthesize ... установка каждого объекта на ноль выпуская каждый объект
  3. Каким-то образом автоматизировать подключение всех кнопок к действию.

Я хочу иметь возможность делать все это в коде и без всего этого копировать / вставлять вещи или повторяемые действия в IB для XCode 4, перетаскивая для создания соединения.

Возможно ли это вообще в этой системе MVC, которую использует XCode 4? Если да, то как?

Update После некоторого исследования я нашел по крайней мере один ответ на мой вопрос - в отношении «Связи с действиями».

Похоже, что если вы добавляете объект - скажем, кнопку и устанавливаете соединение с действием в IB, то, если вы копируете и вставляете эту кнопку (или любой такой объект), IB ОСТАВЛЯЕТ соединения, сделанные в моем случае выше Я создаю кнопку и устанавливаю соединение с действием, и если я копирую и вставляю его, IB выполнит подключения к одному действию для каждой вставленной кнопки. По крайней мере, это сэкономит время. HTH др.

Ответы [ 3 ]

0 голосов
/ 11 августа 2011

В контроллере вида сделайте:

for (int i = 0; i < 50; i++) {
    UIButton *button = [UIButton buttonWithType: UIButtonTypeRoundedRect];
    xpos = ...; // appropriate coordinate go here
    ypos = ...; // appropriate coordinate go here
    [button setFrame: CGRectMake(xpos, xpos, buttonWidth, buttonHeight)];
    [button addTarget: self action: @selector(myCoolAction:) forControlEvents: UIControlEventTouchUpInside];
    [button setTag: i];
    [[self view] addSubview: button];
}

и все будет в порядке.То же самое для изображений ...

0 голосов
/ 03 октября 2011

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

я сделал то, что вы сделали, в том смысле, что я поместил все кнопки в представление, и дошел до объявления объявлений ivar, @property и @synhesize для каждого из них. так как они были в сетке, как вы описали, то, что я сделал, назвал каждого из них в соответствии с button_1x1 button_1x2 и т. д. (т.е. button_rxc в виде строки x столбца, если вы думаете о таблице. Имена не важны, поскольку вы только когда-либо собираетесь ссылаться на них один раз в методе, который вы вызываете из viewDidLoad.

в этом методе я создал кучу NSArrays, которые держали каждую кнопку. например:

    landscapeHidden = [[NSArray arrayWithObjects:
                       button_3x1, button_3x2,                  
                       button_4x1, button_4x2,                  
                       nil] retain];

    portraitHidden = [[NSArray arrayWithObjects:
                      button_1x3, button_1x4, 
                      button_2x3, button_2x4,

                      nil] retain];


    landscapeButtons = [[NSArray arrayWithObjects:
                        button_1x1, button_1x2, button_1x3, button_1x4, 
                        button_2x1, button_2x2, button_2x3, button_2x4, 
                        nil] retain];




    portraitButtons = [[NSArray arrayWithObjects:
                       button_1x1, button_1x2, 
                       button_2x1, button_2x2,  
                       button_3x1, button_3x2,  
                       button_4x1, button_4x2,
                       nil] retain];

Затем я использовал эти массивы всякий раз, когда хотел программно их повторить.

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

как для конструктора интерфейса, попробуйте это:

Удерживая нажатой кнопку управления, один раз нажмите «Владелец файла» и подождите.

тогда вы получите большую панель, которую вы можете использовать для подключения соединений к объектам вида. Я предпочитаю использовать этот метод независимо от того, в каком направлении я соединяю вещи - т.е. если вы перетаскиваете из объектов напрямую, направление, в котором вы перетаскиваете, не всегда удобно. Таким образом, вы можете легко просматривать все торговые точки одновременно. намного проще с моей точки зрения.

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

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

[myArray objectForIndex: ((UIButton*)sender).tag];

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

0 голосов
/ 11 августа 2011

Вы правы в одном, что IB сосет по-королевски. Я очень надеялся, что Apple сделает больше, чтобы исправить это в XCode 4.x.

Тем не менее, я удивляюсь вашему интерфейсу. 50 кнопок на одном экране - это немного. Таким образом, вы можете реорганизовать этот аспект вашего проекта.

Что касается вашей текущей проблемы, поймите, что вы можете создать приложение без IB. Вам нужно научиться программно создавать элементы управления и делать макет. Я бы посоветовал сначала посмотреть образец кода от Apple.

Тем не менее, я хотел бы предложить, думать долго и трудно об этих 50 кнопок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...