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

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

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

Однако в пользовательском интерфейсе Pages окно инспектора очень длинное и встроено в представление прокрутки (вы можете проверить эту прокрутку двумя пальцами в представлении инспектора 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;
}

2 ответа

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

Вот пример с коллекцией просмотров:

  1. Перетащите представление коллекции в viewController. Вы увидите представление коллекции и появление collectionViewItem. Но элемент представления коллекции НЕ связан с представлением коллекции. Если вы попробуете это с помощью IB, ничего не произойдет.
  2. В удостоверении личности инспектора IB присваивают Soryboard ID. Это случайное имя, которое будет использоваться в коде позже. Здесь я использую "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, чтобы злоупотреблять раскадровкой, как описано выше, создавая соединение в конструкторе контроллера. Вы можете использовать storyboardID для запуска представлений и других представлений или загрузки из XIBS. Вы можете поместить viewControllers в раскадровку без соединений (сегментов), чтобы создать пул представлений, которые можно использовать как XIBS. (ViewController более или менее похож на XIB)

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

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

Попробуйте создать представление прокрутки в раскадровке. Создайте представления, которые вы хотели бы видеть в 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 не элегантен. Я тоже много боролся с этим.

Удачи!

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

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

Другие вопросы по тегам