• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Einige Blicke in fremde Welten dürft Ihr nun bestaunen und darüber abstimmen, welche davon Euch am meisten gefällt: hier geht es lang für Euer Voting --> Klick

Probleme mit einem TextView

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Hallo zusammen,

klingt fast wie eine blutige Anfängerfrage, aber es geht um ein TextView das seinen Inhalt vergisst.
Ich habe einen TableView, darin ist unter anderem eine CustomCell enthalten und in dieser CustomCell ist eben die besagte
TextView. Ich kann ganz normal Text hinein schreiben und alles über das Delegate kontrollieren. Wenn ich nun die Eingabe abschließe und dann den TableView ganz nach unten ziehe, so dass die CustomCell nicht mehr zu sehen ist und anschließend die TableView in ihre Ursprungsposition zurückspringen lasse, dann fehlt der Text in der TextView. Würde für mich heißen, dass die CustomCell nach dem verschwinden automatisch dismissed und anschließend neu erzeugt wird. Bin mir aber sicher das das bei früheren Versuchen nie der Fall war.
Ich bin etwas ratlos.

Hier mal etwas Code aus der "Methode cellForRowAtIndexPath"
Code:
        CommentCell *commentCell = [tableView dequeueReusableCellWithIdentifier:@"comment"];
        [commentCell setSelectionStyle:UITableViewCellSelectionStyleNone];
        commentCell.commentLabel.text = @"Bemerkung";
        commentCell.commentTextView.text = report.comment;
        return commentCell;

CommentCell ist eine eigene Klasse die von UITableViewCell erbt.
dort habe ich einen Label und eben die besagte TextView als property angelegt.
Code:
@property (nonatomic, weak) IBOutlet UITextView *commentTextView;
@property (nonatomic, weak) IBOutlet UILabel *commentLabel;

und jetzt weiß ich nicht mehr weiter, wäre echt sehr nett wenn mir da jemand einen Tipp geben könnte.
VG, bginner
 
Bei der Programmierung mit dem Cocoa Touch Framework ist das MVC Pattern essentiell. D.h. Daten gehören in einem Modell gespeichert, nicht in den Views. Wie der Name der Methode dequeueReusableCellWithIdentifier: schon sagt, werden die Zellen einer Tabelle wiederverwendet. Zellen die aus dem sichtbaren Bereich herausgescrollt werden, werden für „reingescrollten“ Inthalt wieder benutzt. Der Inhalt der Views in den Zellen wird also durch anderen Inhalt ersetzt.

MacApple
 
Ok klingt logisch aber ich habe ja mehrere CustiomCells in der TableVilew. Die anderen CustomCells (dort ändere ich über einen ModalViewController den detailTextLabel) haben zwar keine TextView aber behalten auch nachdem sie aus dem sichtbaren Bereicht herausgescrollt wurden ihre Änderung obwohl ich diese nach dem selben Schema angelegt habe. Ich kann herausscrolen was ich will, alle Änderungen bleiben erhalten nur die Zelle mit der TextView macht Probleme.
 
Vermutlich hast Du sogar ein Modell, aus dem Du die Zellen mit den Daten versorgst. Dann wird etwas mit der Übernahme des Inhalts aus den TextViews nicht stimmen, aber ich kenne Deinen Code ja nicht.

MacApple
 
In der Tat habe ich ein Model, es heißt Report und erbt von NSObject.

Ich poste jetzt hier mal den Code des TableViewControllers (NewReportTableViewController.m)
Code:
#import "NewReportTableViewController.h"
#import "ImageCell.h"
#import "IssueTableViewController.h"
#import "CommentCell.h"

@interface NewReportTableViewController ()

@end

@implementation NewReportTableViewController
@synthesize report;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    NSLog(@"comment: %@", report.comment);
    NSLog(@"report.category: %@", report.category);
    
  /*  if (( self.report.image != nil) || (self.report.category != nil))
    {
        [self.tableView reloadData];
        [self.tableView reloadInputViews];
    }*/
    
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    [segue.destinationViewController handleModalObject:report];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;
 
    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
    
    report = [[Report alloc] init];
    issueImageView = [[UIImageView alloc] init];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 4;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0) 
    {
        ImageCell *imageCell = [tableView dequeueReusableCellWithIdentifier:@"image"];
        imageCell.cellLabel.text = @"Bild";
        
        
       if (self.report.image != nil) 
       {
           imageCell.cellImageView.image = issueImageView.image;
           report.image = issueImageView.image;
       }
       else {
           NSLog(@"self.report.image == %@",self.report.image);
       }
            
          return imageCell;
    }
    
    else if (indexPath.row == 1)
    {
        UITableViewCell *categoryCell = [tableView dequeueReusableCellWithIdentifier:@"basic"];
        categoryCell.textLabel.text = @"Kategorie";
        
        if (report.category == nil) 
        {
            categoryCell.detailTextLabel.text = @"bitte wählen";
        } 
        else 
        {
            categoryCell.detailTextLabel.text = report.category;
        }
        
        return categoryCell; 
    }
    
    //Noch nicht implementiert
     else if(indexPath.row == 2)
    {
        UITableViewCell *GPSCell = [tableView dequeueReusableCellWithIdentifier:@"GPSCell"];
        GPSCell.textLabel.text = @"Ortsdaten";
        GPSCell.detailTextLabel.text= @"Lat, Long";
        
        return GPSCell;
    }
    else 
    {
        CommentCell *commentCell = [tableView dequeueReusableCellWithIdentifier:@"comment"];
        [commentCell setSelectionStyle:UITableViewCellSelectionStyleNone];
        commentCell.commentLabel.text = @"Bemerkung";
        commentCell.commentTextView.text = report.comment;
        NSLog(@"Text: %@",report.comment);
        return commentCell;
    }
}

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    if (indexPath.row == 0) 
    {
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        picker.delegate = self;
        
        if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
        {
            picker.sourceType = UIImagePickerControllerSourceTypeCamera;
            
            [self presentModalViewController:picker animated:YES];
        } 
        
        else 
        {
            picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
            [self presentModalViewController:picker animated:YES];
        }
        
    }
    else {
        NSLog(@"Das geht schonmal");
    }

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0)
    {
        return 110;
    } 
    else if(indexPath.row == 3)
    {
        return 150;
    }
    else
        return 50;
}

#pragma mark - UIImagePickerController Delegate

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [picker dismissModalViewControllerAnimated:YES];
}

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    self.report.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    issueImageView.image = self.report.image;
    [picker dismissModalViewControllerAnimated:YES];
}

#pragma mark - TextView Methods

-(void)textViewDidBeginEditing:(UITextView *)textView
{
    UIBarButtonItem* saveItem = [[UIBarButtonItem alloc] initWithTitle:@"Fertig" 
                                                                 style:UIBarButtonSystemItemDone 
                                                                target:textView
                                                                action:@selector(resignFirstResponder)];  
    self.navigationItem.rightBarButtonItem = saveItem;
    [saveItem setStyle:UIBarButtonItemStyleDone];
}


- (void)textViewDidEndEditing:(UITextView *)textView
{
    self.report.comment = textView.text;
    self.navigationItem.rightBarButtonItem = nil;
}

@end

Alles andere ist eher unspannend, trotzdem hier mal die NewReportTabbleViewController .h
Code:
#import <UIKit/UIKit.h>
#import "Report.h"

@interface NewReportTableViewController : UITableViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextViewDelegate>
{
    Report *report;
    UIImageView *issueImageView;
}
@property (nonatomic, strong) Report *report;
@end

und hier die CommentCell.h (die CommentCell.m habe ich nicht verändert)
Code:
#import <UIKit/UIKit.h>

@interface CommentCell : UITableViewCell
@property (nonatomic, weak) IBOutlet UITextView *commentTextView;
@property (nonatomic, weak) IBOutlet UILabel *commentLabel;

@end

Ich hoffe da blickt jemand durch, habe schon alles was auskommentiert war weggelöscht um die Übersicht zu wahren. Wenn noch mehr Quellcode benötigt wird poste ich diesen gern. Das ist echt ein verflixtes Problem, sitze ich schon seit Tagen dran. Bin für jede Hilfe Dankbar
 
Wird die Methode textViewDidEndEditing: denn auch aufgerufen?

MacApple
 
Ja sicher, die Methode wird aufgerufen wie alle anderen Delegate-Methoden auch. In der Methode wird auch der Text des TextViews in meinem Modell gespeichert (überprüft mit NSLog). Der Text verschwindet immer dann wenn sich sie Zelle aktualisiert dann nämlich wird textView.text auf NULL gesetzt weil report.comment auch NULL ist und ich dies dem TextView zuwiese. Ist nur die Frage warum report.comment = NULL ist wo ich doch ganz klar in der in der Methode textViewDidEndEditing: etwas zuweise.

EDIT: Ich habe es jetzt gelöst, hatte die property comment als weak-property angelegt, stattdessen musste es "strong" sein. Das muss ich mir nochmal genau angucken. falls jemand einen guten Link oder ein Tutorial kennt wo die Stellschrauben für propertys erklärt sind wäre ich euch sehr dankbar...
 
Zuletzt bearbeitet: