【问题标题】:UIToolbar UIWebViewUIToolbar UIWebView
【发布时间】:2015-07-19 18:16:32
【问题描述】:

我正在尝试将工具栏添加到 UIWebView。 I have a tableview that when a row is selected, it pushes a UIWebView, in that web view I want a toolbar where I can add forward and back buttons.我正在阅读一本关于 iOS 编程的书,这就是他们要求完成练习的方式。到目前为止,我一直无法让工具栏真正显示在 WebView 中,所以我的问题是我在让工具栏显示时做错了什么?这是我的 UIWebViewController.m 中的代码

UIWebView *webView = [[UIWebView alloc] init];
webView.scalesPageToFit = YES;
self.view = webView;

CGRect frame = CGRectMake(0, 0, 360,44);

UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame: frame];


UIBarButtonItem *back = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemDone target:self action:@selector(goBack)];

NSArray *items = [[NSArray alloc] initWithObjects:back, nil];

[toolBar setItems:items animated:YES];

[self.view addSubview:toolBar];
[self.view bringSubviewToFront:toolBar];

当我运行它时,工具栏没有显示。我已经用实际的 CGRect 框架定位尝试了很多不同的配置,但事实并非如此。更让我困惑的是,如果我采用相同的代码(对工具栏视图进行一些修改并将其放在测试项目的应用程序委托中,则会显示工具栏。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, [[UIScreen mainScreen] bounds].size.height - 44, [[UIScreen mainScreen] bounds].size.width, 44)];

toolBar.barStyle = UIBarStyleDefault;

UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemFixedSpace target:self action:nil];
UIBarButtonItem *back = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRewind target:self action:@selector(goBack)];
UIBarButtonItem *forward = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFastForward target:self action:@selector(goForward)];

NSMutableArray *items = [[NSMutableArray alloc] init];

[items addObject:space];
[items addObject:back];
[items addObject:forward];

[toolBar setItems:items animated:YES];


[self.window addSubview:toolBar];

return YES;

【问题讨论】:

    标签: ios objective-c uiwebview uitoolbar


    【解决方案1】:

    就创建 UIToolbar 而言,代码看起来不错,但我认为 self.view 在您创建它时可能不存在,或者 self.window 在那一刻仍然为零。

    确保您在 viewWillAppearviewDidLoad 方法中调用您的代码,并且此时 self.viewself.window 都存在。

    === 编辑 ===

    我认为另一个问题是您将其添加为 UIWebView 的子视图。 尝试将 UIWebView 添加为视图的子视图。

    [self.view addSubview:webView]
    

    如果你从 nib 加载东西,你这样做的方式似乎是错误的,你不应该用这种方式覆盖 view

    【讨论】:

    • 我在 loadView 中尝试了相同的代码,但我仍然看不到工具栏,并且我在上面实例化工具栏的第一个代码 sn-p 是在 loadView 方法中。使用以下代码从 tableView didSelectRowAtIndexPath 调用 Web 视图 [self.navigationController pushViewController: self.webViewController animated: YES]. 所以 WebView 确实有一个导航控制器,但假设我的框架是 0,0,360,44。工具栏不应该位于窗口底部吗?
    • 如果我将我的代码添加到 viewWillAppear 方法中,这是可行的。如果我在 viewDidLoad 中有它,我不明白为什么它不起作用。 Apples 文档说 viewDidLoad 方法是为以编程方式创建的视图或 nib 调用的。我还在我的 viewDidLoad 方法中添加了一个 NSLog 并且它被打印到控制台证明它被调用了,但是如果添加工具栏的代码在那个方法它不会显示。我不得不将工具栏框架的代码稍微更改为 CGRect rect = CGRectMake(0, self.view.frame.size.height -44, self.view.frame.size.width, 44); 而不是原点位于 0,0
    • 我试了一下,但如果我尝试执行 [self.view addSubview:webView],它会引发崩溃并引发异常“由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'不能将自己添加为子视图'”。请注意,虽然没有从笔尖加载任何内容,但所有内容都是以编程方式创建的。感谢您的帮助,现在我将把我的代码留在 viewWillAppear 中,即使它似乎也应该在 viewDidLoad 中工作。
    • 如果您可以在 GIT 上共享代码,以便我可以运行它并看到它崩溃了,那会容易得多。但是您粘贴的错误可能是由于您犯了一个错误:您应该删除“self.view = webView;”并将其替换为“[self.view addSubview:webView]” - 你可能离开了“self.view = webview”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2012-01-06
    • 2014-09-23
    相关资源
    最近更新 更多