2015-04-28 3 views
0

Есть три типа пользователей в приложение IOS, которые я работаю в эти дни, типы пользователей перечислены ниже:Использование же UIViewController в нескольких раскадровки

  • Стандартный пользователь
  • Руководитель группы
  • Член правления

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

  • Standard User Story Board
  • Руководитель группы Story Board
  • Совет История Член совета

До сих пор, так хорошо!

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

Вопросов:

  • Является ли это правильно делать?
  • Если это правильно, можно ли это сделать?
  • Если возможно, как его реализовать?
+0

Довольно уверен, что вы спрашиваете, если вы можете увидеть дизайн в вашем XIB, встроенном во все три раскадровки. Почти уверен, что это невозможно. –

+0

@SteveMadsen, gotcha! То, о чем я прошу. Не уверен, что то, что я прошу, - это то, что нужно попросить или нет, как функцию раскадровки, но, по крайней мере, это звучит логично. –

+0

Я согласен, что это может быть очень полезно. Вы должны подать заявку на усовершенствование или новую функцию [Радар] (http://bugreport.apple.com), а затем, если вы посещаете WWDC, возможно, зайдите в лаборатории и поговорите с инженером Xcode об этом. –

ответ

1
  • Это правильная вещь?

Это зависит от вашего глобального проекта. Имейте в виду, что то, что вы предлагаете возможно, но может сделать код трудным для понимания/отладки. Действительно, представьте, что вы нажимаете ваш контроллер, создавая его вручную из XIB, как обрабатывать segue с этого контроллера (при условии, что segue должен иметь другое поведение в зависимости от типа пользователя)? Переключить сегмент в зависимости от типа пользователя? Ужасно, если слишком часто ..

  • Возможно ли это? Как его реализовать?

Да, конечно. Например, создайте раскадровку, посвященную совместно используемым компонентам и создайте контроллеры на лету, когда это необходимо (фрагмент написан в Swift, методы одинаковы в Objective-C).

let sharedStoryboard: UIStoryboard = UIStoryboard(name: "SharedStoryboard", bundle: NSBundle.mainBundle()) 
let sharedController: UIViewController = sharedStoryboard.instantiateViewControllerWithIdentifier("ControllerIdentifier") as! UIViewController 
self.navigationController?.presentViewController(sharedController, animated: true, completion: nil) 

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

  • А что делать?

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

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

+0

Представление 'TasksViewController' с тем, как вы предложили, имеет смысл и, безусловно, будет работать, однако' TasksViewController' не появится в интерфейсе проектирования раскадровки в Xcode. Мне просто интересно, есть ли способ, которым «TasksViewController» может быть показан более чем в одной раскадровке. –

1

Да, вы можете это сделать. И я думаю, что хорошо использовать один и тот же ViewController. Другим способом было бы использовать Storyboard для хранения всех многоразовых контроллеров представлений и повторного использования ViewControllers через идентификатор.

Вот решение с XIb:

NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"TaskController" 
                 owner:self 
                options:nil]; 

TaskController *tasks = (TaskController *)[nibViews objectAtIndex:0]; 

// Do the stuff you want here 

Для полноты здесь повторное использование вида контроллер от раскадровки:

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"SomeStoryboard" bundle:[NSBundle mainBundle]]; 
TaskController *nextOpportunity = [sb instantiateViewControllerWithIdentifier:@"YourIdentifier"]; 
Смежные вопросы