2013-02-17 4 views
9

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

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

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

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

Этот вопрос кажется идентичным моему: how to connect UIview outlets to a 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, а не контроллер вида?

+0

Swell. Поэтому я могу, конечно, определить создание элемента управления, скажем, ползунка, вручную и разместить его там, где я хочу. Как, однако, я программно устанавливаю действия (например, Value Changed) в функции в моем пользовательском классе? Я бы установил slider.delegate = myCustomView? – Thunk

+0

Честно говоря, я не знаю. Я ненавижу интерфейс Builder, и я использую его редко. Чтобы программно добавить действия, используйте метод 'addTarget: действие: forControlEvents:' 'UIControl'. – 2013-02-17 07:50:44

+0

Почему бы просто не использовать 'self', а не IBOutlet для себя с помощью * view3? –

ответ

15

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

+0

Это должен быть одобренный ответ. Фактически, когда вы создаете прототип Outlet/Action в формате .h/.m, а затем перетаскиваете соединение из прототипа в IB-элемент, это в меньшей степени позволяет вам создать соединение. –

+0

Это работает для меня. Введите IBOutlet в свой файл, а затем перетащите его из файла в раскадровку, а не наоборот. – SimplGy

+0

Работает отлично. Не знаю, почему это не работает по-другому, делая процесс интуитивно понятным. –

0

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

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

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

+1

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

2

Я открыл ошибку с Apple. Если что-нибудь интересное произойдет, я обновлю этот ответ.

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

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

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

1

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

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

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

0

У меня была такая же проблема, и нашел обходной путь:

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

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

3) Появится возможность создать новое соединение с выходом.

4) Назовите соединение и нажмите подключение

Это будет затем создать связное IBOutlet.

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