2011-03-24 123 views
1

我不完全确定这样做的最佳做法,所以我想我会问。带有嵌套视图控制器的iOS自定义导航

下面是该程序的目标:

  • 经由根的UIViewController创建的自定义导航控制器,其实际上并不子类的UINavigationController(为了容易地操纵设计)
  • 对于不同的屏幕嵌套视图控制器(由操纵主视图控制器)
  • 每个嵌套视图控制器都有自己的笔尖文件

目前,我有它的工作ing,但是每个嵌套视图控制器不是一个视图控制器,而是一个子类UIView。我觉得这是不好的做法,因为我以视图控制器的方式使用这些UIViews,但没有视图控制器的功能(即viewDidLoad)。另外,这些UIViews正在采用UIViewController的通常代理方法(它真的引发了红旗)。

这实际上是不好的做法?

事情恐怕尝试切换到UIViewControllers的时候是我仍然要做出的UIView的子类,以确定哪些查看指向,当我通过加载笔尖:

NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil]; 

for (id object in bundle) { 
    if ([object isKindOfClass:[SubclassedUIView class]]) 
     currentScreenViewController = (SubclassedUIView *)object; 
} 

我的天堂还没有检查,但我假设我必须在该语句中执行“SubclassedUIView”而不仅仅是UIView,因为该包中还有其他UIView对象。但是再一次,这种情况可能比现在的情况好一些。

不同的解决方案可能是使MainViewController成为所有需要委托的UIView的委托,并为每个嵌套的nib创建包含委托方法的MainViewController类别。

这里的任何想法?

回答

0

很显然,我在做什么根据How to add an UIViewController's view as subview有几分确定。

+0

你也可以检查解决方案从另一篇文章http://stackoverflow.com/questions/17499391/ios-nested-view-controllers-view-inside-uiviewcontrollers-view – 2015-07-23 10:13:08

3

为每个SubclassedUIView类型创建一个UIViewController子类,勾选为接口创建XIB文件的选项,然后将所有代码移动到该位置,将其指向self.view。然后用该视图控制器的.xib打开Interface Builder,并尽可能多地配置UIView的外观。为了操纵主视图控制器中的视觉元素,您必须为每个元素分配“标签”编号,或创建一大堆实例变量并将它们连接到IB中的元素。你的方法正确使用本视图控制器一个UINavigationController是:

/* at the top of your main view controller */ 
#import "SubclassedUIViewController.h" 

/* when navigating to the next view */ 
SubclassedUIViewController *newController = [[SubclassedUIViewController alloc] initWithNibName:@"SubclassedUIViewController" bundle:nil]; 
[(UILabel *)[newController.view viewWithTag:6] setText:@"Text"]; // example of accessing elements using tags 
[newController.textLabel setText:@"Text 2"]; // example of accessing elements using IBOutlet connections 
[self.navigationController pushViewController:newController animated:YES]; 
[newController release]; 

Interface Builder中,您还可以导航控制器添加到您的主视图控制器的.xib文件,并提供了返回按钮的文字,主标题等。当你实现你的子类视图控制器,覆盖initWithNibName:bundle:并设置self.navigationItem.titleself.navigationItem你想要的任何其他属性。

编辑:你的意思是你必须能够操纵一些subclassed视图的特定属性,而在其他人的?如在,你需要所有的时间访问它们?如果是这样,则情况在加载主视图控制器让你的子类的意见连接,即:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.subclassedController1 = [[SubclassedUIViewController1 alloc] initWithNibName:@"SubclassedUIViewController1" bundle:nil]; 
    // self.subclassedController2 = ... etc 
} 

/* in your loading next view code you can skip the alloc/init line */ 
[self.navigationController presentViewController:subclassedController2 animated:YES]; 

,然后在子类控制器,你可以到主控制器在几个方面:

  1. 致电self.parentViewController
  2. 致电[(MyCustomAppDelegateClass *)[[NSApplication sharedApplication] delegate] rootView]或类似(基本上,您的应用程序委托对应用程序的主视图的引用)。
  3. 通过将@property (assign)属性和ivar添加到指向主视图控制器的子类控制器中。您可以使用subclassedController1.mainViewController = self加载主视图控制器时指定此选项。

帮助文档:

  1. View Controller Programming Guide for iOS: Navigation Controllers
  2. Xcode Quick Start Guide(更新的Xcode 4)
+0

对不起 - 我不想要UINavigationController的子类,但是,因为它是限制性的。编辑我的问题有点反映,这是明确的。 – AndrewKS 2011-03-25 15:13:15

+0

上面写的所有东西都可以由普通的,非子类的'UINavigationController'处理。我谈论的子类是你用默认导航控制器推送和弹出的内容。即使根视图控制器只是一个子类'UIViewController'。导航控制器本身实际上是在主窗口的Interface Builder界面内定义的,作为根视图控制器主视图的子视图。 – darvids0n 2011-03-28 00:13:26

+0

我想做同样的事情,但假设UINavigationController不是要走的路,因为您无法指定下一个控制器如何转换。例如,push/pop控件从左至右控制它们的动画,但我想要更多地控制它。 我做了一个可以工作的原型,但是我认为它在集成到我的代码库时遇到了多线程问题,因为我的原型项目不再工作。我怀疑UINavigationController中有些复杂的东西,UIViewController不知道怎么做。我不知道。 – horseshoe7 2011-11-24 22:51:03

相关问题