Как встроить контроллер представления раскадровки в NSScrollView OS X (10.10), чтобы создать сложное представление инспектора?

Я смотрю видео WWDC 2014, "212: Раскадровки и контроллеры в OS X< /а>». В этом видео они утверждают, что пользовательский интерфейс Pages может быть организован с использованием Storyboards в OS X (см. ниже).

Снимок экрана из 212: раскадровки и контроллеры в OS X, демонстрирующий макет раскадровки в XCode 6

Однако в пользовательском интерфейсе страниц представление инспектора очень длинное и встроено в представление прокрутки (вы можете проверить это при прокрутке двумя пальцами в представлении инспектора Page.app), а также некоторые элементы инспектора сами содержатся в (какой-то тип пользовательского) вид раскрытия. Кажется невозможным встроить контроллер представления раскадровки в представление прокрутки, потому что нет соответствующего класса «контроллер представления прокрутки». Это правильно?

Как представление контроллера представления раскадровки можно встроить в представление прокрутки раскадровки?

Я пробовал прямое встраивание во время выполнения, однако это очень хакерски и работает ненадежно (проблемы с авто-макетом). Этот маршрут все еще может быть возможен, но я хотел получить совет, прежде чем заходить слишком далеко. Для реального пользовательского интерфейса это может быть случай возврата к XIB.

- (void)viewDidLoad {

    [super viewDidLoad];

    // Swap the view controllers' view for a scroll view
    NSScrollView *scrollView = [[NSScrollView alloc] initWithFrame:self.view.frame];
    scrollView.documentView = self.view;
    scrollView.drawsBackground = NO;
    self.view = scrollView;
}

person Daniel Farrell    schedule 12.12.2014    source источник
comment
Кто-то голосует против всего в этом посте!   -  person Daniel Farrell    schedule 17.11.2015


Ответы (2)


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

Вот пример с представлениями коллекции:

  1. Перетащите представление коллекции в viewController. Вы увидите представление коллекции и появление collectionViewItem. Но элемент представления коллекции НЕ связан с представлением коллекции. Если вы попытаетесь сделать это с помощью IB, ничего не произойдет.
  2. В инспекторе удостоверений IB назначьте идентификатор Soryboard. Это случайное имя, которое позже будет использовано в коде. Здесь я использую "MyCollectionView"
  3. Если вы используете swift, выберите имя вашего проекта в модуле. Код в основном такой же для objC
  4. Подключите представление коллекции к ViewController, содержащему представление коллекции.

Напишите немного кода, чтобы подключить элемент Collection View.

class IVMyCollectionViewController: NSViewController, NSCollectionViewDelegate {

// manual connections to collection view (which is not working in IB)
@IBOutlet weak var collectionView: NSCollectionView!

class var sharedInstance : IVMyCollectionViewController {

    struct Static {

        static var instance:IVMyCollectionViewController? = nil
    }

    if Static.instance != nil {

        return Static.instance!
    } else {

        let bundle      = NSBundle.mainBundle()
        let infoDict    = bundle.infoDictionary!
        let sbName      = infoDict["NSMainStoryboardFile"] as String
        let storyboard  = NSStoryboard(name:sbName, bundle:bundle)!
        let vcName      = "MyCollectionView"
        let sbInstance  = storyboard.instantiateControllerWithIdentifier(vcName) as IVMyCollectionViewController

        Static.instance = sbInstance

        return sbInstance
    }
}

// implement your controller

}

Это означает, что некоторые элементы пользовательского интерфейса еще не реализованы должным образом. Я бы отправил отчет об ошибке в Apple. В конструкторе интерфейсов по-прежнему многого не хватает.

Прямо сейчас я бы использовал смесь раскадровки и xibs, чтобы злоупотреблять раскадровкой, как описано выше, путем создания экземпляра соединения в конструкторе контроллера. Вы можете использовать идентификатор раскадровки для запуска представлений и других представлений или загрузки из xibs. Вы можете разместить viewControllers внутри раскадровки без соединений (segues), чтобы создать пул представлений, которые можно использовать как xibs. (ViewController более или менее похож на xib)

// objC
DetailViewController* controller = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];

или создайте экземпляр, используя идентификатор раскадровки, как указано выше.

Попробуйте создать представление прокрутки в раскадровке. Создайте представления, которые вы хотите отображать в viewControllers для каждого представления. Ваш контроллер представления scrollviews должен иметь соединение с самим представлением прокрутки. В следующем примере выход представления прокрутки называется «self.contentView»:

// instantiate a view controller for your scrolling view
self.scrollingViewController = [[ScrollingViewController alloc] initWithNibName:@"ScrollingView" bundle:nil];

// or do the same with storyboards by instantiating view controllers by ID
self.scrollingViewController = [myStoryboard instantiateControllerWithIdentifier:@"MyScrollingViewID"];

// Then set the view from the controller as content view
[self.contentView setDocumentView:self.scrollingViewController.view];
[self.contentView.contentView scrollPoint:NSMakePoint(0., self.scrollingViewController.view.frame.size.height)];

Это точно так же, как смешать объективный C и быстрый код. Apple, похоже, вступила на путь перехода, который не был пройден до конца.

В общем, вы должны думать, что View- или WindowControllers в раскадровках - это то же самое, что и полный xib-файл. Если вы хотите использовать больше представлений, используйте представления-контейнеры в раскадровках. FilesOwner в xibs — это viewController в раскадровках. Контейнерные представления предлагают вам возможность создать пару представлений, прикрепленных к контроллеру представления. Механизм перехода доступен для контейнеров. Я думаю, что механизм просмотра прокрутки OS X не элегантен. Я тоже много с этим боролся.

Удачи!

person JackPearse    schedule 12.12.2014

  1. Создайте представление, которое будет представлением документа представления прокрутки.
  2. Выберите это представление
  3. Перейдите в «Редактор» > «Встроить» > «Просмотр прокрутки».

На основе эта страница Руководства по программированию Scroll View для Mac.

person Alejandro    schedule 16.11.2015