4

Я создаю приложение iPhone с UITableView. При выборе строки я бы хотел, чтобы UIWebView был загружен при загрузке определенного URL-адреса.UITableView pushViewController при выборе строки

я в настоящее время:

- (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]] 

Заранее спасибо,

Benji

ответ

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, но самая эффективная вещь здесь - просто выделить/запустите его, сохраните в переменной temp, затем вызовите release прямо после того, как мы его нажали. Это гарантирует, что после того, как он будет удален из навигационного стека, он будет освобожден.

+0

Удивительное объяснение - большое спасибо! –

+0

Я бы выполнил 'loadRequest' во время' viewDidLoad', а не 'viewDidAppear' - в противном случае вы будете продолжать перезагружать страницу, если, например, у вас есть контроллер табуляции, который может включать и выключать просмотр. –

+0

Для изучения, Могу ли я получить загружаемое примерное приложение, чтобы увидеть в XCode для вышеперечисленного? – testndtv

0

Чтобы получить uiwebview, просто создайте его с помощью I nterface Builder или определить его как переменную экземпляра в диспетчере просмотра, который вы загружаете. После этого использование nsurlrequest будет работать

0

Лучшим способом было бы создать новый класс контроллера представления, содержащий веб-просмотр. Этот контроллер просмотра имеет свойство url, которое передается через веб-представление, когда оно находится в viewDidLoad.

+0

Как я могу добавить свойство url в контроллер вида? –

+0

Прочитайте [Язык программирования Objective-C 2.0] (http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html). –

1

Во-первых, у вас есть наконечник с именем «FirstView» в вашем проекте?

Во-вторых, способ, которым я обычно это делал, - создать экземпляр ViewController и передать ему параметры перед тем, как направить его в стек nav.

UIViewController *myViewController = [[FirstViewController alloc] initWithNibName:@"FirstView" bundle:[NSBundle mainBundle]]; 
myViewController.story = storyLink; 
[[self navigationController] pushViewController:myViewController animated:YES]; 
+0

Да, у меня есть FirstView nib. Ваш пример подбрасывает меня, а ошибка - запрашивает историю участника в чем-то, что не является структурой или союзом. Думаю, поэтому не нравится \t myViewController.story = storyLink; –

0

Для этого вы можете сделать WebView IBOutlet в FirstViewController затем отправить ссылку URL-адрес через сделав объект FirstViewController

object.urllink = storyUrl;

, то вы можете открыть эту ссылку в UIWebView .....