2014-08-28 3 views
5

Я попытался создать настраиваемый контроллер представления для расширения общего доступа.Доступ к extensionContext из представленного контроллера представления

Сложная ситуация возникает, когда я представляю другой контроллер вида сверху контроллера начального представления, который был установлен на MainInterface.storyboard. Этот представленный контроллер представления встроен в контроллер навигации (это его контроллер корневого представления).

я сделал чек на presentingViewController

(lldb) po [self presentingViewController] 

<_UIViewServiceViewControllerOperator: 0x7a978000> 

(lldb) po [[self presentingViewController] extensionContext] 

nil 

Таким образом, контекст расширения равен нулю в этой точке. Я смог получить доступ к , передав его с представленногоViewController на представленный контроллер контроля.

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

ответ

2

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

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    let destination = segue.destinationViewController as! FinalViewController 
    destination.originalExtensionContext = self.extensionContext 
} 

И в своем заключительном контроллере представления:

@IBAction func dismissController(sender: UIButton!) { 
    dismissViewControllerAnimated(true) {() -> Void in 
     self.originalExtensionContext.completeRequestReturningItems(self.originalExtensionContext.inputItems, completionHandler: nil) 
} 

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

+0

Yup, я понял, что это самый очевидный способ передать контекст расширения. Я спрашивал о поведении свойства extensionContext в SDK. –

+0

Насколько я могу судить (и я использовал этот шаблон пару раз сейчас), нет никакого необычного поведения, если вы передадите ссылку на 'extensionContext'. Вам просто нужно убедиться, что последнее, что вы делаете, это вызов 'completeRequestReturningItems:', поскольку это освободит контекст расширения и все, что вызвано внутри расширения, после чего ничего не сделает. –

1

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

The view controller can check this property to see if it participates in an extension request. If no extension context is set for the current view controller, the system walks up the view controller hierarchy to find a parent view controller that has a non nil extensionContext value.

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

Примечание: Если это не поведение, которое вы наблюдаете, это может быть ошибка с SDK, и я бы рекомендовал подать радар.

+3

Правильно работает, если контроллер представления имеет родительский объект, который имеет расширениеContext, но он ведет себя по-разному, когда представлен представленныйViewController, который не включен в отношения родитель-потомок. –

+0

@JesseArmand верен. Любое представление, представленное модально, не будет содержать представления контроллеров представлений extensionContext. –

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

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