Интерфейсный разработчик не разрешает подключения к пользовательскому классу UIView?

Используя Xcode 4.3.3, я не могу понять, как соединить розетки в пользовательском классе UIView с объектами, созданными в Interface Builder.

В одном ViewController у меня есть множество кнопок, ползунков и т. Д., Которые я пытаюсь сгруппировать в представления. Итак, внутри этого ViewController в IB я добавил 3 представления. В любой момент времени будет виден только 1 просмотр.

Я создал собственные классы UIView для обработки каждого из этих трех представлений. Мой контроллер представления создает экземпляры каждого из классов. Я выбрал представление (а) в IB, открыл инспектор идентичности и установил класс (а) на свой собственный (ые) класс (а). Но когда я попытался перетащить соединения из представления и / или его составляющих элементов управления в файл .h пользовательского представления, IB не добавит соединение.

IB позволяет мне добавлять выходы / действия путем перетаскивания в файл .h родительского контроллера представления, но не в файл .h пользовательского представления. Я подумал, что как только я установил класс View в качестве своего настраиваемого класса, я мог бы перетаскивать выходы для компонентов представления в свой настраиваемый класс, а не в контроллер представления.

Этот вопрос кажется идентичным моему: как подключить выходы UIview к custom subview Два решения (добавление розеток вручную и установка класса представления в IB) не изменили поведения для меня. Вот добавленные мной ручные розетки:

customView3.h

#import <UIKit/UIKit.h>

@interface customView3 : UIView

@property (retain) IBOutlet customView3 *view3;
@property (retain) IBOutlet UISlider *slider;

@end

customView3.m

#import "customView3.h"

@implementation customView3

@synthesize view3, slider;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
    // Initialization code
    }
    return self;
}
@end

Что мне здесь не хватает? Что еще мне нужно установить / проверить, чтобы добавить выходы в мой пользовательский UIView, а не в контроллер представления?


person Thunk    schedule 17.02.2013    source источник
comment
Зыбь. Итак, я определенно могу определить создание элемента управления, например, ползунок, вручную и разместить его там, где я хочу. Но как мне программно установить действия (например, «Изменение значения») для функций в моем пользовательском классе? Могу ли я установить slider.delegate = myCustomView?   -  person Thunk    schedule 17.02.2013
comment
Честно говоря, не знаю. Я ненавижу Interface Builder и использую его редко. Для программного добавления действий используйте addTarget:action:forControlEvents: метод UIControl.   -  person    schedule 17.02.2013
comment
Почему бы просто не использовать self вместо IBOutlet для себя с * view3?   -  person Bryan Luby    schedule 18.02.2013
comment
@Thunk У вас есть какие-то успехи в этом? Я вижу нечто подобное в XCode 4.6, где IB не принимает имя моего подкласса UIView (он издает звуковой сигнал), хотя clang его успешно компилирует.   -  person trojanfoe    schedule 13.03.2013
comment
@trojanfoe Отрицательный. Ничего полезного, чтобы сообщить, так как я зарегистрировал ошибку в Apple.   -  person Thunk    schedule 16.03.2013


Ответы (5)


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

person Janene Pappas    schedule 06.12.2013
comment
Это должен быть одобренный ответ. Фактически, когда вы создаете прототип Outlet / Action в .h / .m, а затем перетаскиваете соединение из прототипа в элемент IB, наименьшее из них позволяет вам создать соединение. - person Yevhen Dubinin; 14.10.2014
comment
У меня это работает. Введите IBOutlet в свой файл, затем перетащите его из файла в раскадровку, а не наоборот. - person SimplGy; 09.03.2015
comment
Прекрасно работает. Не знаю, почему это не работает наоборот, что делает процесс нелогичным. - person Can Poyrazoğlu; 08.08.2017

Обнаружил баг с Apple. Если произойдет что-нибудь интересное, я обновлю этот ответ.

Обновлено 04.10.13: после долгих исследований выяснилось, что корень проблемы в том, что IB считает, что я пытаюсь связать объекты со свойствами внутри класса, и я собираюсь затем создать рой экземпляров этого class, а затем IB не сможет определить, какой экземпляр должен обрабатывать сообщения. Таким образом, он запрещает соединение, полагая, что я (потенциально) устанавливаю одновременные соединения от одного объекта к нескольким копиям свойства в нескольких экземплярах класса.

Я считаю, что мне нужен только один экземпляр пользовательского UIView и что я должен иметь возможность сказать IB: «Не паникуйте, вы имеете дело только с этим одним экземпляром».

Сейчас я сосредоточен на новом проекте, и у меня не было возможности повторить это в Xcode 5; однако, учитывая приведенную выше информацию, я не думаю, что он будет работать и в Xcode 5.

person Thunk    schedule 22.02.2013

То, что вы пытаетесь сделать, безусловно, разумно (ИМО) и возможно. Однако XCode довольно необычен, когда дело доходит до установления соединений с розетками в подпредставлениях.

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

Я знаю, что это не очень полезно, но я просто хотел прояснить, что это предполагается, чтобы работать, а когда это не так, скорее всего, это связано с ошибкой в ​​XCode.

person N.J.    schedule 05.07.2013

По моему опыту, вы добавляете IBAction и IBOutlet в подклассы UIViewController, а не в подклассы UIView. Итак, в модели MVC ваш «1» UIViewController содержит все эти IBOutlet, а затем вы используете данные из этих IBOutlets для обновления ваших представлений.

Итак, вы можете создать объекты UIViews в IB, а затем создать соответствующие классы в коде, а затем изменить класс объектов UIViews в IB на свой подкласс UIView. Просто поместите все IBOutlets в UIViewController, в котором есть все UIViews, получите нужные вам значения из IBOutlets, а затем передайте их (установите) своим подклассам UIView.

Надеюсь это поможет.

person Khaled Barazi    schedule 17.02.2013
comment
ну, моя цель - не иметь весь код для такого количества объектов в одном гигантском контроллере представления. Вот чего я пытаюсь не делать. Я хочу распределить обработчики по отдельным классам (не обязательно быть классами UIView, но это казалось наиболее логичным сочетанием с IB), сгруппированных по задачам, с которыми связаны эти элементы управления. - person Thunk; 17.02.2013

У меня была такая же проблема, и я нашел решение:

1) Откройте редактор помощника с customView3.xib слева и customView3.h справа.

2) ctrl + перетащите из UISlider в customView3.xib в код customView3.h справа

3) Появится опция создания нового подключения к розетке.

4) Назовите соединение и нажмите «Подключиться».

Затем он создаст подключенный IBOutlet.

person Robert Wagstaff    schedule 09.09.2014