| 

.NET C# Java Javascript Exception

3
Hi zusammen,

ich bin sehr neu im Thema iOS Entwicklung, daher hier eine vielleicht für euch blöde Frage aber mir ist die beste Herangehensweise leider nicht ganz klar.

Ich möchte gerne folgendes tun:
Basis ist ein UITabBarController unten in der App. Diese soll 5 TabItems haben. 4 dieser Items sollen nur eine WebView sein, die dieselbe WebView verwenden und quasi nur URLs aufrufen. Sie sollen also im Grunde als Bookmarks dienen. Eine dieser TabItems soll jedoch auf einen eigenen Controller mit eigener View verweisen.

Wie mache ich das am besten? Ich habe mir das TabBarController Beispiel im Xcode angesehen. Dort wird ja ein rootTabBarController erstellt, der für jedes TabItem einen eigenen Controller mit eigener View (.xib) hat. Das ist für mich an sich okay, aber so würde ich ja für jeden Controller eine eigene View brauchen, die ja nur jeweils eine WebView ist. Das ist dann doch ein wenig Speicherverschwendung, wenn ich doch nur eigentlich eine WebView über alle Controller "teilen" müsste. Die Controller setzten dann einfach nur bei Aktivierung einen neuen NSURLRequest auf die WebView?
Funktioniert das? Wenn ja, wie kann ich mehreren Controllern dieselbe View zuweisen? Oder gäbe es da einen besseren Weg?

Vielen Dank für eure Anregungen!
News:
12.03.2012
nairebit 11 3
3 Antworten
2
Du kannst ohne Probleme einen ViewController auch mehreren Tabs zuweisen.
Steuern was du in den ViewController lädst kannst du entweder über TabbarController.getSelected in der viewWillAppear (die wird jedesmal beim wechseln eines Tabs aufgerufen), oder wie Puls200 gesagt hat in tabBarController:shouldSelectViewController:.
Ich kann dir morgen früh, wenn ich in der Arbeit bin ein genaueres Codebeispiel geben. Hab das selber so ähnlich in einer App gemacht. Nur dass ich einen keinen Webview neu befülle, sondern einen UITableView.


So, Hier jetzt mal ein Codebeispiel. Sorry, dass das so lange gedauert hat, aber bei mir ist momentan Land Unter in der Arbeit.

[AppState sharedInstance].tabBarController = self.tabBarController;
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
UIViewController *vc_VideoTab = [[CategoryListViewController alloc] initWithNibName:@"CategoryListViewController" bundle:nil];
UINavigationController *tabNavCtrl_Video = [[UINavigationController alloc] initWithRootViewController:vc_VideoTab];

UIViewController *vc_DownloadsTab = [[DownloadsTabViewController alloc] initWithNibName:@"DownloadsTabViewController" bundle:nil];
UINavigationController *tabNavCtrl_Downloads = [[UINavigationController alloc] initWithRootViewController:vc_DownloadsTab];

UIViewController *vc_NewsTab = [[NewsTabViewController alloc] initWithNibName:@"NewsTabViewController" bundle:nil];
UINavigationController *tabNavCtrl_News = [[UINavigationController alloc] initWithRootViewController:vc_NewsTab];

UIViewController *vc_MehrTab = [[MehrTabViewController alloc] initWithNibName:@"MehrTabViewController" bundle:nil];
UINavigationController *tabNavCtrl_Mehr = [[UINavigationController alloc] initWithRootViewController:vc_MehrTab];
self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = [NSArray arrayWithObjects:tabNavCtrl_Video, tabNavCtrl_Downloads, tabNavCtrl_News, tabNavCtrl_Mehr, nil];
if ([self.tabBarController.tabBar respondsToSelector:@selector(setSelectedImageTintColor:)]) {
self.tabBarController.tabBar.selectedImageTintColor = k_color_red;
}
else
{
//todo find a way to change the selectedImageTintColor for versions older then ios5.
}

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


Das ist jetzt mal ein Beispiel wie ich in der AppDelegate meine Tabbar aufbaue.
Wie du siehst verwende ich in diesem Beispiel für jeden Tab einen eigenen ViewController. Es spricht aber nichts dagegen, dass du einen ViewController auch für 2 Tabs einsetzt.
Das sähe dann ungefär so aus.

UIViewController *vc_VideoTab = [[CategoryListViewController alloc] initWithNibName:@"CategoryListViewController" bundle:nil];
UINavigationController *tabNavCtrl_Video = [[UINavigationController alloc] initWithRootViewController:vc_VideoTab];

UIViewController *vc_DownloadsTab = [[DownloadsTabViewController alloc] initWithNibName:@"DownloadsTabViewController" bundle:nil];
UINavigationController *tabNavCtrl_Downloads = [[UINavigationController alloc] initWithRootViewController:vc_VideoTab];
self.tabBarController.viewControllers = [NSArray arrayWithObjects:tabNavCtrl_Video, tabNavCtrl_Downloads, tabNavCtrl_News, tabNavCtrl_Mehr, nil];


In meinem Beispiel muss ich z.B. je nach selektiertem Tab das Rotationsverhalten meines Tabcontrollers ändern.
Das steuere ich wie folgt:
if (self.tabBarController.selectedIndex == 1) {
return NO;
}
else
{
return [AppState sharedInstance].b_mayRotate;
}


So kannst du bei deinem Beispiel auch in deiner ViewController Klasse unterscheiden, welcher Tab gerade ausgewählt ist und dementsprechend im ViewController in
viewWillAppear

den entsprechenden Content in den WebView laden.


Ich hoffe das hilft dir bei der Lösung deines Problems noch ein wenig weiter.
13.03.2012
Maverick1st 332 1 7
1
Ich kann nicht genau beurteilen ob die Wiederverwendung von UiWebViews sinnvoll ist oder nicht. Es gibt wohl ein paar (lösbare) Probleme, wenn man das versucht. Beim Wechsel der Tabs muss der Content dann neu geladen werden, du tauschst also Speicherverbrauch gegen Zeit. Einhängen müsstest du dich z.B. in tabBarController:shouldSelectViewController: des UITabBarControllerDelegate, um die View in die nächste Tab hinzuzufügen. Vllt. geht das auch noch eleganter, ich habe es jetzt auf die Schnelle nicht selbst ausprobiert. viewDidAppear hilft in diesem Fall nicht, weil das nur einmal aufgerufen wird.
12.03.2012
puls200 3,8k 7
0
Hey,

vielen Dank für eure Antworten. Die helfen mir schonmal gut weiter. Gerne würd ich mir deinen Code ansehen. Wie gesagt, bin ich noch neu auf dem Gebiet und froh über so best practices.
Momentan ist es übrigens so gelöst, dass jeder ViewController bei viewWillAppear eine Subview vom ersten Controller übernehmen. Also in etwa so:
@implementation FinderViewController
@synthesize homeController;

- (void)viewDidLoad
{
[super viewDidLoad];
self.homeController = [self.tabBarController.viewControllers objectAtIndex:0];
}
- (void)viewWillAppear:(BOOL)animated
{
[self.view addSubview:self.homeController.webView];
[self.homeController goToUrl:@"http://www.example.com/"];
}
@end


Das funktioniert an sich gut - wirklich schön finde ich es nicht, da ja alle ViewController diese Abhängigkeit vom "HomeController" (Der 1. ViewController der Tabs) haben.
14.03.2012
nairebit 11 3
Soweit ich das erkennen kann ist die Abhängigkeit auch nicht notwendig - wieso speicherst du die Referenz auf homeController? Eine Referenz auf die UIWebView müsste doch reichen. Davon abgesehen, funktioniert das wirklich gut? Beim Tabwechsel müsste doch je nach Netzwerkverzögerung die "alte" Seite einen Moment stehenbleiben oder?
puls200 14.03.2012
Ja genau das tut sie. Das ist aber auch das gewünschte verhalten.
nairebit 14.03.2012
Hab meine Antwort mal um Codebeispiele ergänzt. Sorry, dass es so lange gedauert hat.
Maverick1st 15.03.2012

Stelle deine Ios-Frage jetzt!