IOS 如何更改现有 UI 以使用新的导航控制器

Posted

技术标签:

【中文标题】IOS 如何更改现有 UI 以使用新的导航控制器【英文标题】:IOS How to alter an existing UI to use a new navigation controller 【发布时间】:2011-01-07 11:03:30 【问题描述】:

好的,我遇到了这个问题。

我使用名为 MainView 的 UITableViewController 自定义类启动了一个应用程序。

在界面生成器中,我修改了视图,以便在顶部有一个文本框和一个按钮以及一个 UITableView。将数据源和委托连接到 MainView 类,并在所有代码中编程以将文本字段用作搜索字段,将按钮用作搜索触发器,然后在适当的委托方法中编程以填充 UITableView。这非常有效。

现在下一步是使用

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
方法能够显示带有与所选行相关的链接的 web 视图。所以阅读我看到我需要添加一个 UINavigationController 混合(以便获得工具栏和导航栏等)。

现在我尝试了这个: 从 Interface builder 添加一个导航控制器,并连接到 appdelegate 和一个 outlet


#import 

@interface ComparateurAppDelegate : NSObject  
    UIWindow *window;
    UINavigationController *navigationController;


@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;

@end

然后在实现中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
[window addSubview:navigationController.view];
    [window makeKeyAndVisible];
  

这启动正常,和以前一样,我没有我应该有的顶部栏。另外,当我尝试在其中推送新视图时,它什么也没做。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    WebViewController *wvc = [[WebViewController alloc] initWithNibName:@"WebViewController.nib" bundle:nil];

[self.navigationController pushViewController:wvc animated:YES];

[wvc release];

我知道代码正在运行,因为我 nslog 它。但什么都没有发生。 WebViewController.nib 是我创建的 nib 文件(现在为空),因此我使用 UIwebview 填充它。

我现在的猜测是视图层次结构没有设置好。

所以我尝试了一些我记不太清的东西,并将工具栏放在我已经拥有的窗口的顶部,但是所有内容都无法访问(比如工具栏是模态对话框而我无法使用底部一个,或者像一个透明视图,您可以在下面看到堆叠的第一个窗口)。 我还尝试像这样以编程方式在 appDelegate 中创建 UINavigation 控制器


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions     

    // Override point for customization after application launch.
    UIViewController *rootController = [[MainView alloc]init];
    navigationController = [[UINavigationController alloc]initWithRootViewController:rootController];
    [rootController release];
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    [window addSubview:navigationController.view];
    [window makeKeyAndVisible];

    return YES;

我得到的只是一个用于界面的空 UITableView,而不是 MainView.nib(其类设置为 MainView)。

TL;DR: 有一个正在运行的应用,想要添加详细视图,并且需要修改为 UINavigationController,但似乎找不到正确的方法。

提前致谢,很抱歉发了这么长的帖子。

【问题讨论】:

有细节的长篇文章胜过没有细节的短篇文章。 【参考方案1】:

尝试改变这个:

UIViewController *rootController = [[MainView alloc]init];

到这里:

UIViewController *rootController = [[MainView alloc]initWithNibName:@"MainView" bundle:nil];

【讨论】:

感谢您的回复,我试过了,现在我得到了这个错误。
2011-01-07 14:20:42.875 Comparateur[46985:207] *** 终止应用程序到期未捕获的异常“NSUnknownKeyException”,原因:“[<mainview> setValue:forUndefinedKey:]:此类不符合键委托的键值编码。” </mainview>
这个,我必须在 IB 中移动视图才能将视图放入控制器中。

以上是关于IOS 如何更改现有 UI 以使用新的导航控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何在导航控制器中将过渡动画从底部更改为顶部?

如何从“菜单”视图控制器在现有 UIViewControllers 之间导航?

如何在 xamarin ios 中从一个视图控制器导航到第二个视图控制器?

在 iOS 7 中更新导航栏而不更改视图

如何更改 iOS 中导航控制器的工具栏颜色?

IOS开发UI篇—导航控制器属性和基本使用