我正在使用UITableView构建iPhone应用程序。在选择行时,我希望在加载特定URL时推送UIWebView。
我目前有:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSDictionary * story = [stories objectAtIndex:[indexPath row]];
NSString * storyLink = [NSString stringWithFormat:[story objectForKey:@"link"]];
[[self navigationController] pushViewController:[[FirstViewController alloc] initWithNibName:@"FirstView" bundle:[NSBundle mainBundle]] animated:YES];
}
如何通过以下方式获取滑入的新视图以包含UIWebView并随后将故事链接加载到其中:
loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:storyLink]]
提前致谢,
畚箕
答案 0 :(得分:9)
正如其他人所说,一般的想法是在FirstViewController上有一个属性,它存储它需要加载的URL,然后在视图出现时将该URL加载到UIWebView中。
以下是一个示例,从标题开始:
@interface FirstViewController : UIViewController {
UIWebView *webView;
NSURL *storyURL;
}
@property (nonatomic, retain) IBOutlet UIWebView *webView; // this is set up in your nib
@property (nonatomic, retain) NSURL *storyURL;
@end
现在实施:
@implementation FirstViewController
@synthesize webView;
@synthesize storyURL;
- (void)dealloc;
{
[storyURL release]; // don't forget to release this
[super dealloc];
}
- (void)viewDidAppear:(BOOL)animated;
{
// when the view appears, create a URL request from the storyURL
// and load it into the web view
NSURLRequest *request = [NSURLRequest requestWithURL:self.storyURL];
[self.webView loadRequest:request];
}
- (void)viewWillDisappear:(BOOL)animated;
{
// there is no point in continuing with the request load
// if somebody leaves this screen before its finished
[self.webView stopLoading];
}
@end
所以现在你需要在控制器中为前一个视图做的就是获取故事URL,将其传递给FirstViewController并推送它。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSDictionary *story = [stories objectAtIndex:[indexPath row]];
NSURL *storyURL = [NSURL URLWithString:[story objectForKey:@"link"]];
FirstViewController *firstViewController = [[FirstViewController alloc] initWithNibName:@"FirstView" bundle:[NSBundle mainBundle]]; // I'm pretty sure you don't need to pass in the main bundle here
firstViewController.storyURL = storyURL;
[self.navigationController pushViewController:firstViewController animated:YES];
[firstViewController release]; // don't leak memory
}
就是这样。其他几点:
我假设词典中的“链接”值已经是一个字符串 - 如果是这种情况,原始示例中不需要构建全新的字符串。正如您在我的示例中所看到的,我们可以直接使用此字符串来创建NSURL
实例。
在原始代码中,当您分配/初始化FirstViewController时,将其直接传递到pushViewController
。这会产生内存泄漏,因为一旦UINavigationController
完成(在它从导航堆栈弹出之后),它的保留计数仍然是1.至少你应该调用autorelease
但效率最高这里要做的就是简单地使用alloc / init它,将它存储在temp变量中,然后在我们推送之后直接调用release
。这样可以确保一旦弹出导航堆栈,它就会被释放。
答案 1 :(得分:1)
首先,你的项目中有一个名为“FirstView”的笔尖吗?
其次,我通常这样做的方法是实例化ViewController并在将参数推送到导航堆栈之前将参数传递给它。
UIViewController *myViewController = [[FirstViewController alloc] initWithNibName:@"FirstView" bundle:[NSBundle mainBundle]];
myViewController.story = storyLink;
[[self navigationController] pushViewController:myViewController animated:YES];
答案 2 :(得分:0)
要获取uiwebview,只需使用Interface Builder创建它,或者将其定义为要加载的viewcontroller中的实例变量。之后使用nsurlrequest将起作用
答案 3 :(得分:0)
最好的方法是创建一个包含webview的新视图控制器类。该视图控制器将具有url
属性,该属性在viewDidLoad
时在Web视图上传递。
答案 4 :(得分:0)
为此你可以在FirstViewController中创建一个IBOutlet webview,然后通过创建FirstViewController的对象来发送url链接
object.urllink = storyUrl;
然后您可以在UIWebView中打开该链接.....