Kommunizierende Sichten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Kommunizierende Sichten

    Hallo,
    ich denke mal die Frage ist bestimmt schon öfters gestellt worden aber ich weiß nicht unter welchem Stichwort ich suchen soll.
    Folgende Aufgabenstellung.
    In der Menüsicht (NSView) werden beim Initialisieren die Sichten B1 - B4 und die Objekt-Sicht (alles NSView) erstellt.
    Wenn nun z.B. auf B1 geklickt wird, soll diese Farblich verändert werden (Button geklickt). Wird anschließend auf B2 geklickt, soll B2 farblich verändert werden (Button geklickt) und B1 soll wieder auf die ursprüngliche Farbe (ungeklickt) gesetzt werden.
    Wird nun anschließend auf die Objekt-Sicht geklickt, soll eine Kopie der gerade geklickten Sicht (also aktuell B2) in dieser Objekt-Sicht erstellt werden.
    Nun die Frage: Wie geht man am besten vor damit die einzelnen Sichten miteinander kommunizieren können. (B2 sagt B1 ändere die Farbe, Objekt-Sicht fragt die Menüsicht oder die Einzlnen B-Sichten wer ist gerade geklickt)
    Dateien
    • sicht.png

      (24,86 kB, 157 mal heruntergeladen, zuletzt: )
    Manchmal schleiche ich mich mitten in der Nacht an meinen Wecker heran und brülle: "NA, WIE FÜHLT SICH DAS AN!!!"
  • Es geht mir vielmehr um das Prinzip wie Werte manuell an andere Objekte übergeben werden. Das Praktische an Sichten ist, das sie die entsprechenden Mouse-Routinen besitzen (Down-Up-Entered), deswegen die Wahl.
    Manchmal schleiche ich mich mitten in der Nacht an meinen Wecker heran und brülle: "NA, WIE FÜHLT SICH DAS AN!!!"
  • Michael schrieb:

    Die einzelnen Sichten sollten überhaupt nicht untereinander kommunizieren, sondern mit einem Controller. Der Controller managed dann die Darstellungen und Aktionen der einzelnen Sichten.

    D.h. ich übergebe den Controller beim Erstellen der Sichten an diese? Wenn ja, mache ich das am besten im Init der einzelnen Sicht?
    Manchmal schleiche ich mich mitten in der Nacht an meinen Wecker heran und brülle: "NA, WIE FÜHLT SICH DAS AN!!!"
  • Das Suchwort dafür ist Master-Detail-Interface. Dazu gibt's beispielsweise ein Tutorial von Apple. Ist schon älter und Xcode sieht mittlerweile anders aus, aber die Konzepte sind im Wesentlichen die gleichen (Controller verwaltet Auswahl, Views sind per Bindings angebunden). Einzelheiten der View-Schicht kann man nach Belieben ändern, das Prinzip ist immer das gleiche.
    Multigrad - 360°-Produktfotografie für den Mac
  • Hier ist ein Beispiel eines UIViewControllers:

    Der ViewController erzeugt 4 MenuViews und verwaltet diese in einem Array.
    Bei der Initialisierung wird jedem MenuView eine Farbe für "normal" und "selektiert" zugewiesen.

    Der UIViewController registriert einen UIGestureRecognizer in jedem MenuView der auf einen "Tap" reagiert.
    Wird auf den MenuView getippt wird eine Action im UIViewController aufgerufen.

    Und das ist das wichtige: Der ViewController steuert, was mit den MenuViews passieren soll.
    Deshalb ist das Touch Handling und die Action Methode im ViewController.

    Quellcode

    1. #import "MenuViewController.h"
    2. @interface MenuView : UIView
    3. @property (nonatomic, assign) BOOL selected;
    4. @property (nonatomic, strong) UIColor *normalColor;
    5. @property (nonatomic, strong) UIColor *selectedColor;
    6. @end
    7. @implementation MenuView
    8. - (void)setSelected:(BOOL)selected
    9. {
    10. _selected = selected;
    11. self.backgroundColor = (_selected == YES) ? _selectedColor : _normalColor;
    12. }
    13. @end
    14. @implementation MenuViewController
    15. - (id)init
    16. {
    17. self = [super init];
    18. if (self) {
    19. self.menuViews = [[NSMutableArray alloc] init];
    20. }
    21. return self;
    22. }
    23. - (UIColor *)viewColor:(NSUInteger)idx
    24. {
    25. switch (idx % 4) {
    26. case 0:
    27. return [UIColor redColor];
    28. case 1:
    29. return [UIColor greenColor];
    30. case 2:
    31. return [UIColor blueColor];
    32. case 3:
    33. default:
    34. return [UIColor yellowColor];
    35. }
    36. }
    37. - (void)selectView:(UIGestureRecognizer *)gestureRecognizer
    38. {
    39. UIView *tappedView;
    40. if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
    41. tappedView = gestureRecognizer.view;
    42. for (MenuView *view in self.menuViews) {
    43. view.selected = (view == tappedView) ? YES : NO;
    44. }
    45. }
    46. }
    47. - (void)loadView
    48. {
    49. UIGestureRecognizer *reg;
    50. UIView *mainView;
    51. NSUInteger i;
    52. mainView = [[UIView alloc] initWithFrame:CGRectZero];
    53. mainView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
    54. for (i = 0; i < 4; i++) {
    55. CGRect frame;
    56. MenuView *menuView;
    57. frame = CGRectMake(60.0f*i + 20.0f, 50.0f, 40.0f, 40.0f);
    58. menuView = [[MenuView alloc] initWithFrame:frame];
    59. menuView.normalColor = [self viewColor:i];
    60. menuView.selectedColor = [UIColor blackColor];
    61. menuView.selected = NO;
    62. reg = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(selectView:)];
    63. [menuView addGestureRecognizer:reg];
    64. [mainView addSubview:menuView];
    65. [self.menuViews addObject:menuView];
    66. }
    67. self.view = mainView;
    68. }
    69. @end
    Alles anzeigen