【问题标题】:Shared NSMutableString for local html filename iphone本地 html 文件名 iphone 的共享 NSMutableString
【发布时间】:2010-08-15 11:52:57
【问题描述】:

我对 Objective C/iPhone 开发比较陌生。

我正在使用导航控制器开发一个带有两个视图的简单应用程序。

第一个视图包含几个按钮 a,第二个视图包含一个 uiwebview。

这个想法是,当按下按钮时,它会切换到第二个视图,并且 Web 视图会加载一个本地 html 文件。加载哪个 html 文件取决于按下哪个按钮。

目前,视图已成功更改,我可以在 webviewcontroller 的 viewdidload 方法中指定要加载的 html 文件。然而这显然意味着每个按钮都会触发相同的 html 文件。

因此,我想创建一个可以从两个视图访问的 NSMutable 字符串(即在第一个视图中设置为特定的文件名,然后在加载 seoncd 视图时检索)。 我已经在互联网上搜索了几个小时,并确实使用了全局变量、单例方法并访问了 appdelegate 中的变量。但是,无论我尝试实现哪种方法,uiwebview 总是显示相同的 html 文件(这是按字母顺序排列的第一个文件)

感谢您提供的任何帮助。我非常感谢任何建议。

【问题讨论】:

    标签: iphone html objective-c global-variables


    【解决方案1】:

    您不必为此使用NSMutableString

    向第二个视图控制器添加一个属性url,只是一个普通的NSString。在将第二个视图控制器推送到导航堆栈之前,将 url 属性设置为要加载的本地 url。

    然后,在第二个视图控制器类中,实现:

    - (void)setUrl:(NSString *)newUrl {
        if(url != newUrl){
            [url release];
            url = [newUrl retain];
            // [webView load.... load the new url in the webView.
        }
    }
    

    这可能超出了您目前的知识范围,它包含一些重要的 Objective-C 代码,例如属性、设置器和内存管理,但只需对其进行测试,看看您可以做些什么来使其工作。

    EDIT 你甚至不需要这个属性。只需在 webViewController 中实现loadUrl: 之类的方法即可。

    - (void)loadUrl:(NSString *)url {
        // [webView load.... load the URL in the webView
    }
    

    然后,在推送 webViewController 之前,使用您要加载的 URL 调用此方法。避免一个属性并摆脱所有额外的内存管理代码。

    if (self.myWebViewController == nil) {
        //initialise
        webViewController *viewWeb = [[webViewController alloc] initWithNibName:@"webViewController" bundle:[NSBundle mainBundle]];
        self.myWebViewController = viewWeb;
        [viewWeb release];
    }
    [self.myWebViewController loadUrl:@"some-local-url"];
    [self.navigationController pushViewController:self.myWebViewController animated:YES];
    

    请注意,一个好的做法是将每个类名大写。现在你有一个类webViewController,但在Cocoa 中通常将类命名为WebViewController,然后你可以有一个名为webViewController 的变量。此外,您可以清楚地看到您是在处理对象(变量)还是只是一个类。

    编辑更新 所以我忘记了在加载视图之前不会加载 webView 的事实。要解决它,您必须重新引入我之前谈到的属性。这次做了一些调整。在您的 webViewController 类中,添加以下代码:

    - (void)viewDidLoad {
        // viewDidLoad gets automatically called once the view has loaded. Here we want to load the webView.
        [self loadWebView];
    }
    
    - (void)setUrl:(NSString *)newUrl {
        if(url != newUrl){
            [url release];
            url = [newUrl retain];
    
            // Update the webView with the newly set URL. This will not do anything if the view hasn't been loaded, since webView will still be nil. That's why we call loadWebView again when the view gets loaded, in viewDidLoad.
            [self loadWebView];
        }
    }
    
    - (void)loadWebView {
        // Here you'll have to load the url. You can access it using `self.url`.
        //[webView load... 
    }
    

    现在,在第一个视图控制器中,将 [self.myWebViewController loadUrl:@"some-local-url"]; 更新为 self.myWebViewController.url = @"some-local-url";

    【讨论】:

    • 非常感谢。我已将 NSString 属性 url 添加到第二个视图控制器,我唯一的问题是如何从第一个视图控制器调用此 setUrl 方法?
    • 请查看我的更新答案。我摆脱了该属性,因为它不是真的必要。
    • 非常感谢。这几乎是完美的。唯一的问题是,当我按下一个按钮时,它会给我一个空白的 uiview,但如果我然后按回导航栏并按下任何按钮,它会显示正确的 html 文件。关于为什么会发生这种情况的任何想法?
    • 这是由于您的UIWebView 将在视图加载时被初始化。第一次推送控制器时,视图将被加载。但是,你在推送之前调用了loadUrl:,所以视图还没有加载,webView 仍然会指向nil。要解决这个问题,您可以在init 中更早地初始化UIWebView,但由于您使用的是Interface Builder,这将不起作用。我没有想到这个问题,但要解决它,你必须使用该属性。我会更新我的答案,请稍等。
    【解决方案2】:

    我假设 Web 视图控制器是从导航控制器初始化的,那么为什么不在初始化时将那个字符串传递给它。然后当按下按钮时,它会使用正确的字符串来启动 Web 视图控制器。

    另一个想法,我认为您已经尝试过,但我不确定,是 Web 视图控制器具有静态方法和值。当您按下按钮时,它会调用 Web 视图控制器上的静态方法。然后当 web 视图控制器加载时,它会调用一个获取值的静态方法。

    【讨论】:

    • 感谢您的快速回复。这是按钮 IBAction 中的代码: if (self.myWebViewController == nil) { //initialise webViewController *viewWeb = [[webViewController alloc] initWithNibName:@"webViewController" bundle:[NSBundle mainBundle]]; self.myWebViewController = viewWeb; [viewWeb发布]; } [self.navigationController pushViewController:self.myWebViewController 动画:YES];我怎样才能“传递”你提到的字符串?对不起,我不明白你的第二个建议。再次感谢
    • 扩展 Web 视图控制器并实现静态方法、getter 和 setter。有一个静态的 NSString,getter 和 setter,返回和操作。在加载 URL 时,通过 getter 将其设置为静态值。因此,在接口中,setter 为 setURL:(NSString *)url;,getter 为 + (NSString *) getURL; + (void) ,然后在实现中,setter 为 + (void) setURL:(NSString *)aUrl { static myUrl = aUrl },getter 为 + (NSString *) getURL { return myUrl }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 2011-04-19
    • 2020-09-06
    • 2022-06-16
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多