本地html文件名iphone的共享NSMutableString

本地html文件名iphone的共享NSMutableString,iphone,html,objective-c,global-variables,Iphone,Html,Objective C,Global Variables,我对Objective C/iPhone开发比较陌生 我正在开发一个简单的应用程序,使用导航控制器提供两个视图 - (void)loadUrl:(NSString *)url { // [webView load.... load the URL in the webView } 第一个视图包含多个按钮a,第二个视图包含uiwebview 这个想法是当按下一个按钮时,它切换到第二个视图,web视图加载一个本地html文件。加载哪个html文件取决于按下哪个按钮 目前,视图已成功更改,我

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

我正在开发一个简单的应用程序,使用导航控制器提供两个视图

- (void)loadUrl:(NSString *)url {
    // [webView load.... load the URL in the webView
}
第一个视图包含多个按钮a,第二个视图包含uiwebview

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

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

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


谢谢你的帮助。我非常感谢您的建议。

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

- (void)loadUrl:(NSString *)url {
    // [webView load.... load the URL in the webView
}
另一个想法,我想您已经尝试过了,但我不确定,就是web视图控制器有一个静态方法和值。当您按下按钮时,它会调用web视图控制器上的静态方法。然后,当web视图控制器加载时,它调用值的get static方法。

您不必为此使用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代码,如属性、setter和内存管理,但只需对其进行测试,看看您能做些什么使其工作

编辑您甚至不需要此属性。只需在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

谢谢你的迅速回复。这是按钮iAction中的代码:if self.myWebViewController==nil{//初始化webViewController*viewWeb=[[webViewController alloc]initWithNibName:@webViewController bundle:[NSBundle mainBundle]];self.myWebViewController=viewWeb;[viewWeb release];}[self.navigationController pushViewController:self.myWebViewController动画:是];我如何才能像你提到的那样传递字符串?很抱歉,我不理解你的第二个建议。感谢你再次尝试web视图控制器并实现静态方法,一个getter和一个setter。有一个静态NSString,getter和setter返回并操纵它。在加载URL时,通过gett将其设置为静态值因此,在接口中,setter将是setURL:NSString*url;getter将是+NSString*getURL;+void,然后在实现中,setter+void setURL:NSString*aUrl{static myUrl=aUrl}和getter+NSString*getURL{return myUrl}非常感谢。我已经向第二个视图控制器添加了一个NSString属性url,我唯一的问题是如何从第一个视图控制器调用此setUrl方法?请查看我的更新答案。我删除了该属性,因为它不是真的需要。非常感谢。这几乎非常有效。唯一的问题是当我按下按钮它会给我一个空白的uiview,但是如果我再按导航栏上的返回键并按任何按钮,它会显示正确的html文件。你知道为什么会发生这种情况吗?这是因为加载视图时UIWebView会被初始化。 第一次按下控制器时,将加载视图。但是,在推之前调用loadUrl:则视图尚未加载,webView仍将指向nil。要解决这个问题,您可以先在init中初始化UIWebView,但因为您使用的是Interface Builder,所以这不起作用。我没有想到这个问题,但要解决它,您必须使用该属性。我会更新我的答案,请稍候。