Verständnis Frage

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

  • Verständnis Frage

    Hi,
    ich arbeite zurzeit gerade wieder an meiner aller ersten App, die ich programmiert habe und füge neue Funktionen hinzu bzw. verbessere den Code. Der Code, den ich jetzt poste ist vlt. etwas schlecht programmiert aber es war wie gesagt meine aller erste App. Deshalb bitte ich um Verständnis und ich überarbeite auch den Code zurzeit. Sachliche Hinweise nehme ich aber gerne an. Nun zu meiner Frage: Ich habe einen TableView und eine Searchbar. In den TableView sind jetzt z.B. 2 Einträge vorhanden. Nun suche ich nach einen Eintrag und dann breche ich es wieder ab und möchte dann wieder alle Einträge sehen. Nur da gibt es leider zwei Probleme:
    1. Das Suchen eines neu hinzugefügten Eintrages funktioniert immer nur nach Neustart der App, obwohl der Eintrag schon längst angezeigt wird
    2. Wenn ich auf Abrrechen klicke, bekomme ich nicht mehr alle Daten sondern nur noch die, die zurzeit angezeigt werden. Wenn zurzeit keine Angezeigt werden, dann bekomme ich auch keine aus meinen Datenmodell zurück. Obwohl ich nichts am Datenmodell ändere oder so, sind die Daten auf einmal weg. Ich raffe das nicht!!

    Was mache ich falsch? Habe ich irgendwas übersehen? Hier mein Code:

    Quellcode

    1. @interface NoticeViewController ()
    2. @property NSMutableDictionary *noticeData;
    3. @property Model *model;
    4. @end
    5. @implementation NoticeViewController
    6. - (void)viewDidLoad
    7. {
    8. [super viewDidLoad];
    9. AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    10. self.model = delegate.model;
    11. }
    12. -(void)viewWillAppear:(BOOL)animated {
    13. [super viewWillAppear:animated];
    14. [self updateData];
    15. NSUbiquitousKeyValueStore *cloudStore = [NSUbiquitousKeyValueStore defaultStore];
    16. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateData) name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:cloudStore];
    17. }
    18. -(void)viewWillDisappear:(BOOL)animated {
    19. NSUbiquitousKeyValueStore *cloudStore = [NSUbiquitousKeyValueStore defaultStore];
    20. [[NSNotificationCenter defaultCenter] removeObserver:self name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:cloudStore];
    21. }
    22. -(void)updateData {
    23. [self.model synchNotice];
    24. self.noticeData = [self.model getNotices];
    25. [self.tableView reloadData];
    26. }
    27. ....
    28. #pragma mark -
    29. #pragma mark SearchBar Delegate
    30. - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    31. self.noticeData = [self.model getNotices];
    32. searchBar.text=@"";
    33. [searchBar setShowsCancelButton:NO animated:YES];
    34. [searchBar resignFirstResponder];
    35. self.tableView.allowsSelection = YES;
    36. self.tableView.scrollEnabled = YES;
    37. [self.tableView reloadData];
    38. }
    39. - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    40. if ([self.noticeData objectForKey:@"headers"] != nil) {
    41. self.tableView.allowsSelection = NO;
    42. self.tableView.scrollEnabled = NO;
    43. NSMutableDictionary *searchDictionarry = [[NSMutableDictionary alloc] init];
    44. NSMutableArray *headers = [self.noticeData objectForKey:@"headers"];
    45. NSMutableArray *data = [self.noticeData objectForKey:@"data"];
    46. for (int i = 0; i<data.count; i++) {
    47. [searchDictionarry setObject:[data objectAtIndex:i] forKey:[headers objectAtIndex:i]];
    48. }
    49. NSString *searchText = searchBar.text;
    50. NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"(SELF beginswith[cd] %@) OR (SELF endswith[cd] %@) OR (SELF contains[cd] %@)", searchText, searchText, searchText];
    51. NSArray *resultsArray = [headers filteredArrayUsingPredicate:searchPredicate];
    52. headers = [NSMutableArray arrayWithArray:resultsArray];
    53. [data removeAllObjects];
    54. for (int i=0; i<headers.count; i++) {
    55. [data addObject:[searchDictionarry objectForKey:[headers objectAtIndex:i]]];
    56. }
    57. [self.noticeData setObject:headers forKey:@"headers"];
    58. [self.noticeData setObject:data forKey:@"data"];
    59. [self.tableView reloadData];
    60. [searchBar resignFirstResponder];
    61. self.tableView.allowsSelection = YES;
    62. self.tableView.scrollEnabled = YES;
    63. }
    64. }
    Alles anzeigen


    Viele Grüße
    Nils
  • Ah! Jetzt habe ich endlich nach solanger Zeit endlich verstanden, was ich immer wieder falsch gemacht habe!
    Mit

    Quellcode

    1. self.noticeData = [self.model getNotices];

    Lege ich keine Kopie des Objektes an, sondern nur eine Referenz auf diesen. Und wenn self.noticeData geändert wird ändert sich somit auch das Model.

    So funktioniert es:

    Quellcode

    1. self.noticeData = [[NSMutableDictionary alloc] initWithDictionary:[self.model getNotices]];
  • AppleDeveloper schrieb:

    Ah! Jetzt habe ich endlich nach solanger Zeit endlich verstanden, was ich immer wieder falsch gemacht habe!
    Mit

    Quellcode

    1. self.noticeData = [self.model getNotices];

    Lege ich keine Kopie des Objektes an, sondern nur eine Referenz auf diesen. Und wenn self.noticeData geändert wird ändert sich somit auch das Model.

    So funktioniert es:

    Quellcode

    1. self.noticeData = [[NSMutableDictionary alloc] initWithDictionary:[self.model getNotices]];


    Nein das kann nicht sein.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Wie das kann nicht sein? Warum? Ist aber irgendwie so, denn dadurch funktioniert es. Denn wenn ich es wie oben mache ändere ich gleichzeitig die Daten des Modells um. getNotices sieht so aus:

    Quellcode

    1. -(NSMutableDictionary *)getNotices {
    2. return self.notices;
    3. }

    Liefert der hier nicht nur ein Pointer zurück und deswegen werden die Daten im Modell auch geändert?
  • Nein, denn mit

    Quellcode

    1. self.noticeData = [[NSMutableDictionary alloc] initWithDictionary:[self.model getNotices]];


    bekommt self.noticedata einen Zeiger auf eine neue Referenz. Da wird nichts am Model geändert. Dein Fehler muss wo anders liegen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)