2014-12-10 2 views
0

У меня есть (упрощенный) иерархии видов Cocoa следующим образом:Как ссылаться на подсмотр из другого в иерархии представлений программным путем?

window 
- contentView 
-- view1 
---> button1 
--view2 
---> textField1 

Важно отметить, что button1 & textField1 НЕ передаём немедленно SuperView.

Я хотел бы добавить целевое действие к button1, чтобы выполнить что-то (не уместно, что именно) на textField1 (рассмотрите textField1 - это какое-то пользовательское текстовое поле, которое я создал).

В моем понимании, при инициализации кнопка должна иметь ссылку на textField1, чтобы вы могли добавить «целевое действие».

Моим вопрос: что это лучший способ для button1 заполучить эту ссылку таким образом, что будет масштабироваться до более сложного/глубокого/вложенного вида иерархий

Я надеюсь, ищу что-то немного больше элегантнее:

let reference = self.superview.subview[0].subview[0] as NSView 

Interface Builder позволяет щелкнуть правой кнопкой мыши и перетащить с помощью кнопки на TextField, чтобы сделать «соединение», и он использует какой-то внутренний идентификатор для этого. Их что-то похожее делается в коде?

+0

Вы пытались добавить событие к кнопке в contentView? Вы можете получить доступ к своему текстовому полю1, просто позвонив self.view2.textField1. – Miknash

+0

Как 'contentView' знает, что у него есть член' view2' и аналогичным образом, как бы 'view2' знал, что у него есть член' textField1'? Представляете ли вы, что я установил их как членов, помимо того факта, что они были добавлены в массив 'subViews'? – Sam

+0

хорошо, вы можете проверить это, верно? вам нужно добавить это подвью и, следовательно, вы можете проверить, существуют ли они. Вы можете добавить их как членов, а также получить доступ к этому, потому что управлять этими представлениями будет проще. – Miknash

ответ

1

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

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

Существует много способов сделать это, но основным принципом является то, что они отделены друг от друга. У кнопки будет действие. Это действие может иметь целевой метод на контроллере представления, он может запускать NSNotification, ... ViewController будет обрабатывать это, а затем делать что-то с текстовым полем на другом представлении.

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

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

+0

Я понимаю ваш ответ - хорошая практика MVC. Что, если ситуация такова, что куча взглядов работает вместе, чтобы сформировать более крупный (составной) контроль? Как и во всех компонентах ScrollView или TableView. Таким образом, «модель» на самом деле является созданием виджета пользовательского интерфейса. – Sam

+0

Ну, похоже, вам нужен делегат и источник данных, как и Scrollview и TableView. Используйте делегат для отправки действий обратно из вашего составного представления, т. Е.действие кнопки и использовать источник данных для вытягивания данных для заполнения текстового поля. В качестве примера я просто вытащил из github, проект, который я использовал ... см. Https://github.com/nicklockwood/SwipeView, который использует делегат и источник данных. Не блестящий пример, поскольку в основном это UIView, в котором размещается UIScrollView, но вы можете получить суть. – bandejapaisa

+0

В качестве альтернативы, если вы действительно хотите, чтобы они разговаривали друг с другом в составном виде, и это компонент черного ящика, тогда объявите UITextField и UIButton на верхнем общем уровне, сохраненные как экземпляры vars. Создайте подзаголовки вашего компонента и поместите текстовое поле и кнопку в качестве подзонов внутри них. Тогда они могут общаться без использования superv.subview (что, по моему мнению, является запахом кода). Все зависит от того, сколько вы хотите это сделать и как многократно использовать, чтобы сделать это. – bandejapaisa