/ / Wie man zwischen UIViews innerhalb eines UIViewController tauscht? - ios, objective-c, uiview, uipickerview, uipickerviewdelegate

Wie man zwischen UIViews innerhalb eines UIViewController tauscht? - ios, objective-c, uiview, uipickerview, uipickerviewdelegate

Ich habe 8 erstellt UIViews, Ich habe ein UIPicker und wenn der Benutzer etwas mit dem auswählt UIPicker Ich führe den Thread durch eine große if-Anweisung, über die ich nicht glücklich bin.

Ich würde gerne wissen, ob das, was ich mache, okay ist? Und wenn der Code, den ich benutze, um die Ansicht zu laden, so ist, wie es gemacht werden sollte ... der Code ist unten, du wirst sehen, ich lade einfach die UIView einmal, dann bringe ich es in die erste Ebene ... Ich würde es lieber komplett neu laden, indem ich aus subview entferne ... aber ich konnte das nicht zur Arbeit bringen ..

Irgendeines der UIViews kann zu einem Zeitpunkt geladen werden, was das Problem verursacht.

#pragma mark - Picker Delegates
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
// ReloadView
if (row == 0) {
if (my1View == nil ) {
[self DrawView1];
}
[self.view bringSubviewToFront:my1View];
} else if (row == 1) {
if (my2View == nil ) {
[self DrawView2];
}
[self.view bringSubviewToFront:my2View];
}else if (row == 2) {
if (my3View == nil ) {
[self DrawView3];
}
[self.view bringSubviewToFront:my3View];
}else if (row == 3) {
if (my4View == nil ) {
[self DrawView4];
}
[self.view bringSubviewToFront:my4View];
}else if (row == 4) {
if (my5View == nil ) {
[self DrawView5];
}
[self.view bringSubviewToFront:my5View];
}else if (row == 5) {
if (my6View == nil ) {
[self DrawView6];
}
[self.view bringSubviewToFront:my6View];
}else if (row == 6) {
if (my7View == nil ) {
[self DrawView7];
}
[self.view bringSubviewToFront:my7View];
}else if (row == 7) {
if (my8View == nil ) {
[self DrawView8];
}
[self.view bringSubviewToFront:my8View];
}
}

Das einzige andere Problem ist, dass es manchmal auf einer Ansicht hängen bleibt, egal was ich anwähle, nichts wird darüber geladen werden.

Antworten:

0 für die Antwort № 1

Vor allem, vielleicht um es schöner zu machen, könnte man über eine Switch-Anweisung nachdenken, aber in Bezug auf die Leistung ist das egal:

switch (row) {
case 0:
if (my1View == nil ) {
[self DrawView1];
}
[self.view bringSubviewToFront:my1View];
break;
case 1:
if (my1View == nil ) {
[self DrawView2];
}
[self.view bringSubviewToFront:my2View];
break;

//THE OTHER CASES HERE...

default:
break;
}

Über den Rest: Ich würde vorschlagen, dass Sie alle Ansichten in ein Array oder ein Wörterbuch stellen und auch eine Variable haben currentView

@property (nonatomic, strong) UIView* currentView;
@property (nonatomic, strong) NSMutableDictionary* myViews;

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
// ReloadView
UIView* myNewView =
[self.myViews objectForKey:[NSString stringWithFormat:@"%d",(int)row]];

if (myNewView!=self.currentView) {
[self.currentView removeFromSuperview];
}
if (!myNewView) {
[self drawView:row];
}
[self.view addSubview:myNewView];
self.currentView = myNewView;
}

Stellen Sie sicher, dass Sie die myViews Eigenschaft in Ihrer AnsichtDidLoad (oder etwas ähnliches) wie folgt:

self.myViews = [NSMutableDisctionary new];

Außerdem benötigen Sie eine neue Methode für diese Zeile: [self drawView:row];In diesem können Sie einfach Ihre bestehenden Methoden aufrufen oder Ihre vorhandenen Methoden in diese kopieren!

Um so wenig wie möglich zu ändern, können Sie verwenden:

- (void)drawView:(NSInteger)row
{
switch (row) {
case 0:
[self DrawView1];
break;
case 1:
[self DrawView2];
break;

//THE OTHER CASES HERE...

default:
break;
}
}

0 für die Antwort № 2

Ich habe eine App, die einen Platzhalter UIView hat(self.mainView) für ViewController, die basierend auf einer Tab-Auswahl platziert werden. Das Verwenden dieser Technik ist gut, weil dann nur eine der Ansichten zu jeder Zeit geladen wird, und ich kann eine ViewController-Klasse erstellen, die mit dieser Ansicht arbeitet, anstatt einen monolithischen Controller zu haben, der alle Ansichten verstehen muss, die sich an dieser Stelle befinden.

Hier ist ein Beispielcode, mit dem ich den entsprechenden viewController in diesem Platzhalter anzeigen kann.

@property (weak, nonatomic) IBOutlet UIView *mainView;
@property (strong) UIViewController *currentController;

if (self.currentController) {
[self.currentController willMoveToParentViewController:nil];
[[self.currentController view] removeFromSuperview];
[self.currentController removeFromParentViewController];
self.currentController = nil;
}


switch (row) {
case 0:
self.currentController = [self.storyboard instantiateViewControllerWithIdentifier:@"AboutViewController"];
break;

case 1: {
...
}
break;
}


if (self.currentController) {
[self addChildViewController:self.currentController];
[self.mainView addSubview:self.currentController.view];
[self.currentController didMoveToParentViewController:self];
[self adjustMainView]; // my own method to adjust some constraints base on flags
[self.view layoutIfNeeded];
}

0 für die Antwort № 3

Ich entwickle Ihr Projekt und ich kann kein Problem in Ihrem Code sehen. Funktioniert gut. Es gibt kein Problem in dem Code, den Sie zeigen. Vielleicht sollten Sie mehr Code teilen, um es zu überprüfen.

Ich habe versucht, deinem Stil zu folgen, aber ich habe kleine Dinge geändert.

Sie können das von mir erstellte Projekt finden, um Ihren Code zu testen Hier.