Μετάβαση στο περιεχόμενο


Φωτογραφία

Αποθήκευση NSString για χρήση από κάποιοViewController


  • Παρακαλούμε συνδεθείτε για να απαντήσετε
17 μηνύματα σε αυτό το θέμα

#1   Stamatisse

Stamatisse

    iPH newbie

  • 11 μηνύματα
  • Φύλο: Άντρας

Δημοσίευση 01/02/2012 - 23:33

Καλησπέρα σε όλους,

Έχω το εξής πρόβλημα. Έχω διάφορα view controllers και θέλω από το ένα (loginViewController το οποίο περιέχει ένα text field) να κρατήσω ένα NSString (userID) για να μπορέσω να το χρησιμοποιήσω αργότερα ως μεταβλητή στα υπόλοιπα, π.χ στο getUserHistoryViewController.

Προσπάθησα να το αποθηκεύσω απλά μέσα από ένα IBAction ως:
- (IBAction) saveUser{
	NSLog(@"- Save button pressed");
	userID = userIDField.text;
}
Και να το καλέσω με το όνομα του view controller:
loginViewController.userID
αλλά πρέπει να είναι μεγάλη γκάφα... :huh:

Έχει κανείς καμιά ιδέα;
Ευχαριστώ εκ των προτέρων!

Ad

Ad

Team
iPhoneHellas
3,1416 μηνύματα
Twitter: @android
Φύλο: Όπως το δει κανείς
Κινητό: Android
Tablet: Για τα κουνούπια

Γιατί να γίνετε μέλη;

#2   MihalisTsoukalos

MihalisTsoukalos

    iPH User

  • 136 μηνύματα
  • Twitter:@mactsouk
  • Φύλο: Άντρας
  • Κινητό: iPhone 5
  • Tablet:iPad mini

Δημοσίευση 01/02/2012 - 23:57

Η NSLog() δεν αποθηκεύει αλλά τυπώνει.
Ποια μεταβλητή κρατάει το NSString;

φιλικά,

#3   Stamatisse

Stamatisse

    iPH newbie

  • 11 μηνύματα
  • Φύλο: Άντρας

Δημοσίευση 02/02/2012 - 00:09

Η NSLog() δεν αποθηκεύει αλλά τυπώνει.
Ποια μεταβλητή κρατάει το NSString;

φιλικά,


Ναι, ήταν στον κώδικα και την αντέγραψα καταλάθος. :rolleyes:

Θέλω να αποθηκεύσω την τιμή που έχω στο userID για να τη χρησιμοποιήσω από αλλού. Δεν έχω ιδέα πως θα το κάνω αυτό. Δε γνωρίζω πολλά πράγματα, καθώς έχει λίγο καιρό που άρχισα... Η εφαρμογή είναι για την πτυχιακή.

#4   michel1972

michel1972

    iPH Addict

  • 841 μηνύματα
  • Φύλο: Άντρας
  • Κινητό: iPhone 5
  • Tablet:iPad

Δημοσίευση 02/02/2012 - 00:15

Ρε παιδια μιληστε λιγο ελληνικα τι ειναι αυτα που γραφετε.....

#5   Stamatisse

Stamatisse

    iPH newbie

  • 11 μηνύματα
  • Φύλο: Άντρας

Δημοσίευση 02/02/2012 - 00:17

Ρε παιδια μιληστε λιγο ελληνικα τι ειναι αυτα που γραφετε.....

Αν γράφω κάτι που δε καταλαβαίνεις μπορείς να ρωτήσεις...

#6   Stamatisse

Stamatisse

    iPH newbie

  • 11 μηνύματα
  • Φύλο: Άντρας

Δημοσίευση 02/02/2012 - 02:27

Προφανώς επειδή δε ξέρω πολλά, τα είπα κάπως μπερδεμένα...
Θα προσπαθήσω να γίνω πιο κατανοητός.

Έχω μία εφαρμογή βασισμένη σε tableView. Μετά το αρχικό rootViewController έχω φτιάξει ένα νέο view με τα historyViewController.h και .m μαζί με το nib που έχει το νέο tableView. Όταν ανοίγει αυτό το view χρειάζεται να περάσω μέσα ένα string (υποτίθεται ένα ID χρήστη) το οποίο θα πρέπει να είναι αποθηκευμένο από πριν. Έτσι θεώρησα σωστό να φτιάξω ένα ακόμα view με ένα textfield που θα εισάγω εκεί το string.

Δε καταλαβαίνω πως θα αποθηκεύσω αυτό το string στο view με το textfiled και πως θα το περάσω στο historyViewController.m.
Ελπίζω να αυτό να είναι πιο κατανοητό... καμιά ιδέα (ή ερώτηση);

#7   iKostis

iKostis

    iPH Enthousiast

  • 361 μηνύματα
  • Φύλο: Άντρας

Δημοσίευση 02/02/2012 - 09:02

Προφανώς επειδή δε ξέρω πολλά, τα είπα κάπως μπερδεμένα...
Θα προσπαθήσω να γίνω πιο κατανοητός.

Έχω μία εφαρμογή βασισμένη σε tableView. Μετά το αρχικό rootViewController έχω φτιάξει ένα νέο view με τα historyViewController.h και .m μαζί με το nib που έχει το νέο tableView. Όταν ανοίγει αυτό το view χρειάζεται να περάσω μέσα ένα string (υποτίθεται ένα ID χρήστη) το οποίο θα πρέπει να είναι αποθηκευμένο από πριν. Έτσι θεώρησα σωστό να φτιάξω ένα ακόμα view με ένα textfield που θα εισάγω εκεί το string.

Δε καταλαβαίνω πως θα αποθηκεύσω αυτό το string στο view με το textfiled και πως θα το περάσω στο historyViewController.m.
Ελπίζω να αυτό να είναι πιο κατανοητό... καμιά ιδέα (ή ερώτηση);


Χωρίς storyboard:
OpenNextViewController *varNextPageController = [[OpenNextViewController alloc] initWithNibName:@"OpenNextViewController" bundle:nil];
varNextPageController .textString= userID;
[[self navigationController] pushViewController:varNextPageController animated:YES];
[varNextPageController release];

Με storyboard:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    
    if ([[segue identifier] isEqualToString:@"NextViewController"]) {
        OpenNextViewController *onvc = [segue destinationViewController];
        onvc.textString = userID;
    }
}


#8   Stamatisse

Stamatisse

    iPH newbie

  • 11 μηνύματα
  • Φύλο: Άντρας

Δημοσίευση 02/02/2012 - 12:08

Χωρίς storyboard:

OpenNextViewController *varNextPageController = [[OpenNextViewController alloc] initWithNibName:@"OpenNextViewController" bundle:nil];
varNextPageController .textString= userID;
[[self navigationController] pushViewController:varNextPageController animated:YES];
[varNextPageController release];


iKostis, thanks! Δεν το έκανα ακριβώς έτσι αλλά βοήθησε πολύ. :)

#9   iKostis

iKostis

    iPH Enthousiast

  • 361 μηνύματα
  • Φύλο: Άντρας

Δημοσίευση 02/02/2012 - 12:25

Εννοείται οτι θέλει κάποιες αλλαγές..αυτό ήταν όσο πιο γενικό γίνεται για να καταλάβεις το τρόπο. :)

#10   Lefteris23

Lefteris23

    iPH Addict

  • 624 μηνύματα
  • Twitter:@LefterisHaritou
  • Φύλο: Άντρας
  • Κινητό: iPhone 5
  • Tablet:iPad 3

Δημοσίευση 02/02/2012 - 17:25

Αν μια μεταβλητή είναι global, είτε αποθήκευσε την στα NSUserDefaults είτε πέρνα την στο AppDelegate. ;)

#11   Lefteris23

Lefteris23

    iPH Addict

  • 624 μηνύματα
  • Twitter:@LefterisHaritou
  • Φύλο: Άντρας
  • Κινητό: iPhone 5
  • Tablet:iPad 3

Δημοσίευση 02/02/2012 - 17:27

Επίσης αν την περνάς από controller σε controller, όπως έγραψε ο Κώστής, να την κάνεις declare ως copy στο header του controller.

@interface SomeClass : NSObject
{
    NSString* name;
}

@property (nonatomic, copy) NSString* name;

@end



#12   Stamatisse

Stamatisse

    iPH newbie

  • 11 μηνύματα
  • Φύλο: Άντρας

Δημοσίευση 02/02/2012 - 17:36

...είτε πέρνα την στο AppDelegate. ;)


Τελικά έκανα αυτό, λίγο ατσούμπαλα μάλλον, αλλά έπιασε. Έτσι μπορώ να την περνάω σε όποιο controller θέλω. Για την ακρίβεια:
//  BookstoreAppDelegate.h
NSString *userID;

// someViewController.h
BookstoreAppDelegate *savedID;
NSString *userID;

// someViewController.m
savedID = (BookstoreAppDelegate *)[[UIApplication sharedApplication] delegate];
userID = savedID.userID;

Δε ξέρω κατά πόσο είναι σωστό κάτι τέτοιο. Αλλά μπορώ να έχω το userID όπου χρειάζεται μέσα στην εφαρμογή. ;)

#13   Lefteris23

Lefteris23

    iPH Addict

  • 624 μηνύματα
  • Twitter:@LefterisHaritou
  • Φύλο: Άντρας
  • Κινητό: iPhone 5
  • Tablet:iPad 3

Δημοσίευση 02/02/2012 - 19:55

Τελικά έκανα αυτό, λίγο ατσούμπαλα μάλλον, αλλά έπιασε. Έτσι μπορώ να την περνάω σε όποιο controller θέλω. Για την ακρίβεια:

//  BookstoreAppDelegate.h
NSString *userID;

// someViewController.h
BookstoreAppDelegate *savedID;
NSString *userID;

// someViewController.m
savedID = (BookstoreAppDelegate *)[[UIApplication sharedApplication] delegate];
userID = savedID.userID;

Δε ξέρω κατά πόσο είναι σωστό κάτι τέτοιο. Αλλά μπορώ να έχω το userID όπου χρειάζεται μέσα στην εφαρμογή. ;)


Μια χαρά είναι.
Πάντως εξαιρετικά απλό και χρήσιμο είναι και η αποθήκευση στα NSUserDefaults που τα αποθηκεύει σαν pList το λειτουργικό.

#14   nickbit

nickbit

    iPH Member

  • 287 μηνύματα
  • Twitter:@bitoulas
  • Φύλο: Άντρας
  • Κινητό: iPhone 4S
  • Tablet:iPad 4

Δημοσίευση 04/02/2012 - 11:57

Μια πιο σωστή λύση από άποψη δομής είναι να φτιάξεις ένα class User, το οποίο θα είναι και singleton εφόσον έχεις να κάνεις με ένα χρήστη.
Οπότε το access στο χρήστη θα γίνεται με ένα call τύπου [User sharedUser].
Ορίζεις και ένα readWrite property με όνομα userID στην class, οπότε

- (IBAction) saveUser{
[User sharedUser].userID = userIDField.text;
}

Αντίστοιχα από τους controllers κάνεις με τον ίδιο τρόπο read.

Δε σου δίνω περισσότερα για να ψάξεις τουλάχιστον το singleton.
Εάν θέλεις περισσότερα για καλύτερη δομή των προγραμμάτων δες το βιβλίο HeadFirst - Design Patterns.
Είναι για Java αλλά θα καταλάβεις.

Εάν το userID θέλεις να είναι ασφαλείας και θέλεις να χρησιμοποιήσεις τα UserDefaults για την αποθήκευσή του,
κάνε τουλάχιστον encrypt με ένα κατάλληλο αλγόριθμο.
Θα βρεις αρκετά NSString categories με encryption στο Internet.

Τελευταία επεξεργασία από: nickbit, 04/02/2012 - 11:59


#15   Lefteris23

Lefteris23

    iPH Addict

  • 624 μηνύματα
  • Twitter:@LefterisHaritou
  • Φύλο: Άντρας
  • Κινητό: iPhone 5
  • Tablet:iPad 3

Δημοσίευση 04/02/2012 - 14:14

Εαν θέλεις ασφάλεια, δεν χρειάζεται να κάνεις δικές σου πατέντες, αρκεί η αποθήκευση στο KeyChain

To singleton για αποθήκευση και μόνο ενός userId και Password για μένα είναι overkill, εκτός και αν θες να αποθηκεύεις και άλλα στοιχεία εκεί.
Όπου και πάλι αν είναι multiuser εφαρμογή, καλύτερα να έχεις δικό σου custom class παρά singleton.

Τελευταία επεξεργασία από: Lefteris23, 04/02/2012 - 14:17


Ad

Ad

Team
iPhoneHellas
3,1416 μηνύματα
Twitter: @android
Φύλο: Όπως το δει κανείς
Κινητό: Android
Tablet: Για τα κουνούπια

Γιατί να γίνετε μέλη;



Χρήστες που διαβάζουν αυτό το θέμα: 1

0 μέλη, 1 επισκέπτες, 0 ανώνυμοι χρήστες