2013-03-20 5 views
5

У меня есть UITabController с пятью вкладками. Каждая вкладка просто содержит экземпляр пользовательского UIViewController, и каждый экземпляр содержит UIWebView.Различные URI для каждого экземпляра UIViewController

Я хочу, чтобы UIWebView на каждой вкладке открывал другой URI, но я не думаю, что это должно быть необходимо для создания нового класса для каждой вкладки.

Я могу заставить его работать, если я делаю [self.webView loadRequest:] в -(void)viewDidLoad, но кажется смешным создавать пять разных классов с пятью различными версиями viewDidLoad, когда все, что я действительно хочу изменить, это URI.

Вот что я пробовал:

appDelegate.h

#import <UIKit/UIKit.h> 

@interface elfAppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate> 

@property (strong, nonatomic) UIWindow *window; 
@property (strong, nonatomic) UITabBarController *tabBarController; 

@end 

appDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    customVC *start = [[customVC alloc] init]; 
    customVC *eshop = [[customVC alloc] init]; 
    customVC *table = [[customVC alloc] init]; 
    customVC *video = [[customVC alloc] init]; 
    customVC *other = [[customVC alloc] init]; 

    // Doesn't do anything... I wish it would! 
    [start.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]]]; 

    self.tabBarController = [[UITabBarController alloc] init]; 
    self.tabBarController.viewControllers = @[start, eshop, table, video, other]; 

    self.window.rootViewController = self.tabBarController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

customVC.h

#import <UIKit/UIKit.h> 

@interface customVC : UIViewController <UIWebViewDelegate> { 
    UIWebView* mWebView; 
} 

@property (nonatomic, retain) UIWebView* webView; 

- (void)updateAddress:(NSURLRequest*)request; 
- (void)loadAddress:(id)sender event:(UIEvent*)event; 

@end 

customVC.m

@interface elfVC() 

@end 

@implementation elfVC 

@synthesize webView = mWebView; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.webView = [[UIWebView alloc] init]; 
    [self.webView setFrame:CGRectMake(0, 0, 320, 480)]; 
    self.webView.delegate = self; 
    self.webView.scalesPageToFit = YES; 

    [self.view addSubview:self.webView]; 

} 

ответ

3

Создайте свойство типа NSURL* в вашем customVC.

Изменить -(id)init метод вашего customVC к -(id)initWithURL:(NSURL*)url следующим образом:

-(id)initWithURL:(NSURL*)url{ 
self = [super init]; 
if(self){ 
    self.<URLPropertyName> = url; 
} 
return self; 
} 

Затем вызовите

[start.webView loadRequest:[NSURLRequest requestWithURL:self.<URLPropertyName>]]; 

в viewDidLoad

Затем, когда вы инициализировать различные экземпляры customVC, просто использовать

customVC *vc = [customVC alloc]initWithURL:[NSURL URLWithString:@"http://..."]]; 
+0

Выглядит многообещающе, но я должен где-то смущаться. В _customVC.h_ я добавил '@property (nonatomic, сохранить) NSURL * initURL;'. В _customVC.m_ я добавил '@synthesize initURL;' и '- (id) initWithURL: (NSURL *) url { [self setInitURL: url]; return self; } '. Я получаю сообщение об ошибке «Методы Init должны возвращать тип, относящийся к типу приемника». Что я должен возвращать? –

+0

См. Отредактированный ответ. – Petar

+0

Я все еще получаю ту же ошибку. Я должен упомянуть, что ошибка является _ARC Semantic Issue_. Я неправильно создаю свою собственность? Если это не '@property (неатомный, сохранить) NSURL * initURL;'? –

1

Я подозреваю, что вы инициализируете свой веб-просмотр после вызова метода loadRequest:. Чтобы избежать этого, это лучшая практика для инициализации неатомической свойства, перекрывая их сеттеры:

- (UIWebView*)webview { 
    if (mWebView == nil) { 
     // do the initialization here 
    } 
    return mWebView; 
} 

Таким образом, ваш WebView будет инициализирован при первом к нему доступ (при вызове loadRequest:), а не после него, в пользовательском зрения контроллер viewDidLoad способ.

+0

Спасибо. Я не уверен, что это действительно решает мою проблему, но я ценю совет. –

Смежные вопросы