UITableView pushViewController选择一行

时间:2009-07-24 15:31:17

标签: iphone objective-c cocoa-touch uitableview uinavigationcontroller

我正在使用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]]

提前致谢,

畚箕

5 个答案:

答案 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中打开该链接.....