Etwas umfangreichere Frage...zum Austausch und Ausgeben von einem String durch mehrere ViewController

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

  • Etwas umfangreichere Frage...zum Austausch und Ausgeben von einem String durch mehrere ViewController

    Ich muss jetzt doch mal fragen, wie ich mein Problem lösen könnte:
    Ich will eine App entwickeln, bei der man in ein Textfeld (vorerst) einen Buchstaben oder Zeichen eintippt (Interface im Anhang) und man dann in weiteren View Controllern durch Buttons entscheiden kann, welches "hübschere" Sonderzeichen man dafür verwenden will (Eigentlich sinnlos, aber besonders gut geeignet um zB für iOS Spiele sich ein paar hübsche Namen zu machen (Bspl: Lords&Knights)) . Also werde ich für jeden Buchstaben, Zeichen einen eigenen View Controller haben. Jetzt habe ich aber das Problem, dass ich einen globalen String brauche, auf den jeder ViewController zugreifen, editieren, leeren, ausgeben, etc. kann.
    Nehmen wir jetzt beispielsweise mal an, in der Ausgabe steht schon der Text "Beispiel". Jetzt gebe ich in die Eingabe den Buchstaben "e" ein und klicke auf den Button "Vorschläge anzeigen". Der VC wertet die Eingabe aus und öffnet mir den View Controller "e". Dort drücke ich zum Beispiel auf einen Button mit dem Namen "Ɛ". Jetzt soll der ViewController "e" auf den String zugreifen, das gerade ausgewählte Sonderzeichen dem schon existierendem Text in der Ausgabe hinzufügen und ausgeben (Oder auch irgendwie an den ViewController fürs Hauptmenü weiterleiten, damit dieser es ausgibt. Jetzt ist meine Frage, wie ich diesen Appweiten String erstelle und mit anderen VCs darauf zugreife.
    Ich würde mich freuen, wenn ihr mir eine ausführliche Antwort gebt, mit der ich etwas anfangen kann oder auch ein Tutorial im Internet, das ist mir egal, hauptsache ich verstehs :)

    MfG Johannes
  • johannesm98 schrieb:

    Wenn ich das ins AppDelegate.h mach kommt immer die Fehlermeldung:

    Quellcode
    1
    Initializer element is not a compile-time constant


    Hast du ne Idee warum ? :/

    Du deklarierst diese Variable außerhalb einer Methode. Bei globalen Variablen sind die möglichen Werte für Zuweisungen sehr eingeschränkt.
    „Meine Komplikation hatte eine Komplikation.“
  • Ok also hier die AD.h

    Quellcode

    1. #import <UIKit/UIKit.h>
    2. @class ViewController;
    3. @interface AppDelegate : UIResponder <UIApplicationDelegate>
    4. @property (strong, nonatomic) UIWindow *window;
    5. @property (strong, nonatomic) ViewController *viewController;
    6. @property (strong,nonatomic) NSString *ausgabeString;
    7. @end
    Alles anzeigen



    (Kann es sein dass ich die anderen View Controller noch deklarieren muss?)

    Und hier die AD.m

    Quellcode

    1. #import "AppDelegate.h"
    2. #import "ViewController.h"
    3. @implementation AppDelegate
    4. -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    5. {
    6. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    7. // Override point for customization after application launch.
    8. self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    9. self.window.rootViewController = self.viewController;
    10. [self.window makeKeyAndVisible];
    11. return YES;
    12. }
    13. - (void)applicationWillResignActive:(UIApplication *)application
    14. {
    15. // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    16. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
    17. }
    18. - (void)applicationDidEnterBackground:(UIApplication *)application
    19. {
    20. // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    21. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    22. }
    23. - (void)applicationWillEnterForeground:(UIApplication *)application
    24. {
    25. // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
    26. }
    27. - (void)applicationDidBecomeActive:(UIApplication *)application
    28. {
    29. // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    30. }
    31. - (void)applicationWillTerminate:(UIApplication *)application
    32. {
    33. // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    34. }
    35. @end
    Alles anzeigen



    Eigentlich das Standard Delegate
  • na super, ich hab schon zwei Bücher "Einstieg in Objective-C 2.0 und Cocoa", da steht das aber nicht drin und "Apps programmieren für iPhone und iPad" aber entweder steht das dort auch nicht drin oder ich find es einfach nicht. Ihr könnt mir auch gerne ein Kapitel sagen, wo das drinsteht, aber eine etwas hilfreichere Antwort zu geben wäre nett, anstatt zu jedem Anfänger "kauf dir n buch dann kannst nochmal fragen" zu sagen!
  • Du könntest dir ein Protokoll definieren, welches dein Delegate erfüllen soll und jedem ViewController eine Referenz auf dein Delegate mitgeben.*
    Dann kommst du im ViewController ungefähr so da ran:

    C-Quellcode

    1. // Lesend
    2. NSString * theStringInQuestion = [delegate ausgabeString];
    3. // Schreibend
    4. [delegate setAusgabeString:theNewString];


    Da du aber nirgends den String instanziiert hast, dürfte das einfach nicht funktionieren.
    Häng mal in die - application: didFinishLaunchingWithOptions: folgende Zeile ein:

    C-Quellcode

    1. ausgabeString = @"initial test string";


    Dann sollte das laufen.
    Anschließend gehst du ne Runde um den Block, setzt dich hin und liest in einem deiner Bücher nach, warum zum Teufel man Instanzvariablen instanziieren muss.

    * du kannst es auch lassen und mit performSelector: oder valueForKey: arbeiten. Wird dann aber etwas fehleranfälliger.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Ich habe im Internet ein pdf gefunden, in dem stand, dass globale Variablen außerhalb der {} gesetzt werden müssen und man in anderen Dateien mit "extern" darauf zugreifen können!
    Dazu habe ich einfach mal eine kleines Testprojekt gemacht, das aber auch nicht funktioniert. Hier der Code, damit ihr vielleicht mal versteht, was ich überhaupt meine:

    ViewController.h

    Quellcode

    1. #import
    2. #import "secondViewController.h"
    3. NSString *theString = @"";
    4. @class secondViewController;
    5. @interface ViewController : UIViewController
    6. {
    7. IBOutlet UILabel *outputLabel;
    8. secondViewController *second;
    9. }
    10. -(IBAction)changeString:(id)sender;
    11. -(IBAction)toSecondViewController:(id)sender;
    12. @end
    Alles anzeigen


    ViewController.m:

    Quellcode

    1. #import "ViewController.h"
    2. #import "secondViewController.h"
    3. @interface ViewController ()
    4. @end
    5. @implementation ViewController
    6. -(IBAction)changeString:(id)sender
    7. {
    8. theString = [NSString stringWithFormat:@"%@ changedString1", theString];
    9. [outputLabel setText:theString];
    10. }
    11. -(IBAction)toSecondViewController:(id)sender
    12. {
    13. second.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    14. [self presentViewController:second animated:YES completion:nil];
    15. }
    16. - (void)viewDidLoad
    17. {
    18. [super viewDidLoad];
    19. second = [[secondViewController alloc]initWithNibName:@"secondViewController" bundle:nil];
    20. [outputLabel setText:theString];
    21. // Do any additional setup after loading the view, typically from a nib.
    22. }
    23. - (void)didReceiveMemoryWarning
    24. {
    25. [super didReceiveMemoryWarning];
    26. // Dispose of any resources that can be recreated.
    27. }
    28. @end
    Alles anzeigen


    secondViewController.h:

    Quellcode

    1. #import <UIKit/UIKit.h>
    2. @interface secondViewController : UIViewController
    3. {
    4. }
    5. -(IBAction)backToFirstViewController:(id)sender;
    6. @end


    secondViewController.m:

    Quellcode

    1. #import "secondViewController.h"
    2. @interface secondViewController ()
    3. @end
    4. extern NSString *theString;
    5. @implementation secondViewController
    6. -(IBAction)backToFirstViewController:(id)sender
    7. {
    8. [self dismissViewControllerAnimated:YES completion:nil];
    9. theString = [NSString stringWithFormat:@"%@ changedString2", theString];
    10. }
    11. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    12. {
    13. self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    14. if (self) {
    15. // Custom initialization
    16. }
    17. return self;
    18. }
    19. - (void)viewDidLoad
    20. {
    21. [super viewDidLoad];
    22. // Do any additional setup after loading the view from its nib.
    23. }
    24. - (void)didReceiveMemoryWarning
    25. {
    26. [super didReceiveMemoryWarning];
    27. // Dispose of any resources that can be recreated.
    28. }
    29. @end
    Alles anzeigen


    Wie gesagt, es reicht mir eine einfache kleine Strichliste mit schritten was ich tun muss oder ein link zu einem tutorial :)
    (Und bitte sagt nicht wieder, ich solle erst einmal die Grundlagen lernen! Dieses Forum ist nunmal da, den Leuten zu helfen (vor allem Anfängern) und wenn ich in meinen Büchern nichts brauchbares finde, muss ich ja irgendwo fragen!)

    MfG Johannes