Laden Sie alle Zellen in UITableView, bevor Sie weiter scrollen
Ich habe einen UITableView mit 8 Zellen(Abschnitte) insgesamt, in der 6 von Ihnen enthalten Textfelder, wie Untersichten und aus der 2 eine mit Knopf und die andere mit der text-Ansicht.Jetzt habe ich hier ein problem,wie wir alle wissen, dass, wenn jemals der Ansicht erscheint nur die sichtbaren Zellen lädt.Also, wenn meine app geladen wird,bin ich in der Lage, um 5 Zellen,die 4 ersten mit text-Felder und die 5. Zelle mit der-Taste.Ich sehe die array-Zählung 4 angezeigt, wenn ich es durch Protokollierung in der Konsole, d.h.
there are 4 objects in the array
Nun nach dem scrollen der Tabelle anzeigen,ich kann beachten Sie folgende Hinweise:
there are 6 objects in the array
So,was passiert ist, Wenn ich auf speichern die eingegebenen Daten in der Tabelle anzuzeigen,oder sagen Sie Bearbeiten, um änderungen an bestehenden Daten,bin ich gezwungen zu scrollen, die Tabelle anzeigen und geben Sie die Werte in die Letzte Zelle zu.Also, dass kann nicht der Fall sein immer mit dem Benutzer, da können wir nicht erwarten, dass ihm/Ihr das scrollen der Tabellenansicht, und geben Sie die vollständige form/table view Zelle Einträge.Was auch immer änderungen, die er/Sie macht, Sie wird und Sie nur klicken Sie auf fertig/speichern, was auch immer es ist..!
Mehr über ich bin ein picker view als input view für Letzte Zelle mit text-Feld als Untersicht.Daher meiner picker Sicht Zeile auswählen-Methode ich bin mit crash-problem mit der letzten Zelle/den Abschnitt(textField als Untersicht) mit einem picker anzeigen: hier ist mein code snippet für die Methode:
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
switch (tagValues)
{
case 105:
{
self.textField = [self.fields objectAtIndex:3];
self.textField.text = [self.reminder objectAtIndex:row];
}
break;
case 107:
{
//Crash occurring in this case,sometimes its working wonder why
self.textField = [self.fields objectAtIndex:5];
self.textField.text = [self.group objectAtIndex:row];
}
break;
}
}
**Note**:I am using the same textField for adding as subview to all 6 cells,but each one with unique tags and own purpose,i.e. one for editing text using key board,one with date picker,one with general picker etc...
Frage ich mich, warum einige Zeiten nach auswählen von Werten aus picker-Ansicht(im letzten Abschnitt der Zelle) stürzt einige Male, und einige Male gut funktioniert.Einige Male stürzt es bei der oben genannten Zeile kommentiert Fall 107,einige Male in Haupt-autorelease pool.Einige Zeit thread, wie gezeigt, in der snap-unten:
Also gibt es eine Möglichkeit, dass können wir laden, alle Zellen auf einmal, so dass alle text Felder Hinzugefügt array, bevor Sie weiter scrollen.Es gibt keine problem, ich glaube
Mehr Detaillierte BEARBEITETEN CODE zum Verständnis:
- (UITableViewCell *)tableView:(UITableView *)atableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//NSString *identifier = @"UITableViewCell";
NSString *cellIdentifierF = nil;
static NSString *firstCellIdentifier = @"FirstCell";
static NSString *secondCellIdentifier = @"SecondCell";
static NSString *thirdCellIdentifier = @"ThirdCell";
static NSString *fourthCellIdentifier = @"FourthCell";
static NSString *fifthCellIdentifier = @"FifthCell";
static NSString *sixthCellIdentifier = @"SixthCell";
static NSString *seventhCellIdentifier = @"SeventhCell";
static NSString *eightCellIdentifier = @"EightCell";
if(indexPath.section == 0 && indexPath.row == 0)
{
cellIdentifierF = firstCellIdentifier;
}
else if(indexPath.section == 1 && indexPath.row == 0)
{
cellIdentifierF = secondCellIdentifier;
}
else if(indexPath.section == 2 && indexPath.row == 0)
{
cellIdentifierF = thirdCellIdentifier;
}
else if(indexPath.section == 3 && indexPath.row == 0)
{
cellIdentifierF = fourthCellIdentifier;
}
else if(indexPath.section == 4 && indexPath.row == 0)
{
cellIdentifierF = fifthCellIdentifier;
}
else if(indexPath.section == 5 && indexPath.row == 0)
{
cellIdentifierF = sixthCellIdentifier;
}
else if(indexPath.section == 6 && indexPath.row == 0)
{
cellIdentifierF = seventhCellIdentifier;
}
else if(indexPath.section == 7 && indexPath.row == 0)
{
cellIdentifierF = eightCellIdentifier;
}
UITableViewCell *cell = (UITableViewCell *)[atableView dequeueReusableCellWithIdentifier:cellIdentifierF];
atableView.backgroundColor = [UIColor clearColor];
textField = [[[UITextField alloc]initWithFrame:CGRectMake(15, 12, 300, 24)]autorelease];
textField.textColor = [UIColor whiteColor];
textField.delegate = self;
tagValues = textField.tag;
switch (indexPath.section)
{
case 0:
{
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifierF] autorelease];
cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"buttonbg-1.png"]];
//Only add content to cell if it is new
if([cellIdentifierF isEqualToString: firstCellIdentifier])
{
textField.placeholder = @"Enter name";
[self.textField setValue:[UIColor purpleColor]
forKeyPath:@"_placeholderLabel.textColor"];
textField.tag = 101;
textField.text = reminderInstance.Name;
textField.autocorrectionType = UITextAutocorrectionTypeNo;
NSLog(@"Value = %@",textField.text);
[cell.contentView addSubview:textField];
[self.fields addObject:textField];
}
}
}
break;
case 1:
{
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifierF] autorelease];
cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"buttonbg-1.png"]];
//Only add content to cell if it is new
if([cellIdentifierF isEqualToString: secondCellIdentifier])
{
textField.tag = 102;
textField.text = reminderInstance.Event;
NSLog(@"Value = %@",textField.text);
[cell.contentView addSubview:textField];
[self.fields addObject:textField];
}
}
}
break;
case 2:
{
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifierF] autorelease];
cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"buttonbg-1.png"]];
//Only add content to cell if it is new
if([cellIdentifierF isEqualToString: thirdCellIdentifier])
{
textField.placeholder = @"Click here to set date and time";
[self.textField setValue:[UIColor purpleColor]
forKeyPath:@"_placeholderLabel.textColor"];
textField.inputView = self.datePicker;
textField.text = reminderInstance.Date;
textField.tag = 103;
NSLog(@"Value = %@",textField.text);
[cell.contentView addSubview:textField];
[self.fields addObject:textField];
}
}
}
break;
case 3:
{
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifierF] autorelease];
cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"buttonbg-1.png"]];
//Only add content to cell if it is new
if([cellIdentifierF isEqualToString: fourthCellIdentifier])
{
textField.tag = 105;
textField.text = reminderInstance.numDays;
textField.inputView = self.reminderPicker;
NSLog(@"Value = %@",textField.text);
[cell.contentView addSubview:textField];
[self.fields addObject:textField];
}
}
}
break;
case 4:
{
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifierF] autorelease];
cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"buttonbg-1.png"]];
//Only add content to cell if it is new
if([cellIdentifierF isEqualToString: fifthCellIdentifier])
{
checkboxButton = [[[UIButton alloc] initWithFrame:CGRectMake(16,1,120, 44)]autorelease];
[checkboxButton setImage:[UIImage imageNamed:@"ewee.png"] forState:UIControlStateNormal];
[checkboxButton addTarget:self action:@selector(toggleButton:) forControlEvents:UIControlEventTouchUpInside];
NSString *one = reminderInstance.selString;
NSNumber* i = [NSNumber numberWithInt:[one intValue]];
BOOL isOn = [i boolValue];
if(isOn)
{
[checkboxButton setImage:[UIImage imageNamed:@"checkarrow.png"] forState:UIControlStateNormal];
}
else
{
[checkboxButton setImage:[UIImage imageNamed:@"ewee.png"] forState:UIControlStateNormal];
}
NSLog(@"String Val = %@",one);
[checkboxButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[checkboxButton setImageEdgeInsets:UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)];
[cell addSubview:checkboxButton];
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(55, 10, 225, 24)];
label.text = @"Every Year";
label.textColor = [UIColor whiteColor];
label.backgroundColor = [UIColor clearColor];
[cell addSubview:label];
cell.textLabel.textColor = [UIColor whiteColor];
[label release];
}
}
}
break;
case 5:
{
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifierF] autorelease];
cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"buttonbg-1.png"]];
//Only add content to cell if it is new
if([cellIdentifierF isEqualToString: sixthCellIdentifier])
{
textField.placeholder = @"Enter the number here";
[self.textField setValue:[UIColor purpleColor]
forKeyPath:@"_placeholderLabel.textColor"];
textField.text = num;
textField.text = reminderInstance.number;
textField.tag = 106;
textField.userInteractionEnabled = YES;
textField.keyboardType = UIKeyboardTypeNumberPad;
NSLog(@"Value = %@",textField.text);
[cell.contentView addSubview:textField];
[self.fields addObject:textField];
}
}
}
break;
case 6:
{
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifierF] autorelease];
cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"reminderbuttonxl.png"]];
//Only add content to cell if it is new
if([cellIdentifierF isEqualToString: seventhCellIdentifier])
{
cell.backgroundColor = [UIColor clearColor];
textView.clipsToBounds = YES;
textView = [[UITextView alloc]initWithFrame: CGRectMake(-2, -3, 307, 154)];
UIImageView *imgView = [[[UIImageView alloc]initWithFrame: textView.frame]autorelease];
imgView.image = [UIImage imageNamed: @"buttonbg_text.png"];
[textView addSubview: imgView];
[textView sendSubviewToBack: imgView];
textView.backgroundColor = [UIColor clearColor];
textView.delegate = self;
textView.tag = 11;
tagValues = textView.tag;
textView.textColor = [UIColor purpleColor];
[cell.contentView addSubview:textView];
textView.text = @"Your birthday wishes/other reminder body here";
NSLog(@"Value = %@",textView.text);
}
}
}
break;
case 7:
{
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifierF] autorelease];
cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"buttonbg-1.png"]];
//Only add content to cell if it is new
if([cellIdentifierF isEqualToString: eightCellIdentifier])
{
textField.tag = 107;
textField.inputView = self.groupPicker;
tagValues = textField.tag;
textField.text = reminderInstance.remGroup;
NSLog(@"Value = %@",textField.text);
[cell.contentView addSubview:textField];
[self.fields addObject:textField];
}
}
}
break;
default:
break;
}
int size = [fields count];
NSLog(@"there are %d objects in the array", size);
return cell;
}
Ich habe mehrere versuche unternommen, um herauszufinden, was genau schief gehen, auch ich überprüft einige Fragen hier und es.Aber konnte keine effiziente/appr. Antwort oder, dass löst mein Problem.
So jemand bitte helfen Sie mir mit wertvollen Anregungen oder Beispiel-code-Schnipsel.
Danke an alle im Voraus 🙂
- Ich glaube, es ist nicht möglich, load-Zellen, die nicht sichtbar sind. Die Tabelle ziehen die Daten aus der Datenquelle und nur laden Sie die sichtbaren Zellen. Die anderen Zellen geladen wird, wie Sie Blättern und die Sie sichtbar werden.
- wo sind Sie machen neue Zelle, wenn es nicht vorhanden ist
- Danke, Herr Burgess meines Wissens auch wusste, was u sagte.. aber ich bin vor einer Menge von Problemen, da dieser, weil mit heraus änderungen zu speichern, oder berühren Sie die Letzte Zelle nach dem scrollen bin ich nicht zum aktualisieren von Daten auch ohne das zu tun.Auch sagen wenn der Benutzer die Tabelle ansehen,gefüllt mit den eingegebenen Daten zu diesem Zeitpunkt.Sagen Sie dann, wenn der user nebenbei ändert die ersten 2-Zellen und auf fertig klickt.Dann ist es in Anbetracht der letzten Feld(unsichtbare) Werte als null, obwohl es Werte gibt.
- Bitte finden Sie den code unter "Detaillierte BEARBEITETEN CODE für Verständnis:"gibt es in jedem Fall bin ich die Schaffung neuer Zelle, wenn es nicht vorhanden ist
- Sollten Sie aus der ivars und die Datenquelle für das speichern und aktualisieren, anstatt die Werte in die Zellen. Von dort speichern, so, wenn Sie nicht immer sehen Sie Ihre off-screen-Zellen, die Werte sind immer noch da.
- Ich bin mir nicht bewusst, ivars,kann u vorschlagen mich ein tutorial oder Beispielcode,danke 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Würde es Sinn machen, dass es eine Menge Probleme aus dem Weg Sie werden den Aufbau der form (was tatsächlich der Fall ist)
was ich getan habe mich, als ich brauchen, um zu bauen, ein solches Formular zu erstellen verwenden Sie eine normale Ansicht mit allen Steuerelementen, was lang ist und die form, in der ein Bildlauf anzeigen und einstellen seiner Inhalte Größe mit der Größe der Ansicht im it. das würde lassen Sie Sie haben mehr Kontrolle darüber, wie Sie wollen, die form zu schauen.
und ich glaube nicht, dass ich gesehen habe eine app mit einem tableview für einen Formular-Eintrag.
können Sie interface builder, bauen Sie Ihre form (nur cheat auf Xcode und die wichtigsten anzeigen und scrollen-vew groß genug, so u kann sehen, was auf den generator, dann ändern Sie es auf die entsprechende Größe, wenn Sie fertig sind)
Es klingt wie könnten Sie besser dran, nicht mit einer Tabelle anzeigen, sondern mit Hilfe einer scroll-view statt. Wenn Sie wirklich haben einen festen Betrag der Dinge, die Sie gehen, um anzuzeigen, können Sie einfach legen Sie diese auf ein scroll-view-Ansichten (statt Tabelle-Zellen) und Ihren code erhalten viel einfacher.
Wenn das, was Sie wollen aus der Tabelle ist nur die Erscheinung, Sie können einfach mit einem Hintergrundbild, das sieht so aus, wie Sie möchten, und blenden Sie die Aussicht und steuert über diesen hintergrund. Sie sollten in der Lage sein, all dies zu tun in den Interface Builder.
Wenn Sie diesem Ansatz, der code in der view-controller wird nun genau das, was Sie brauchen, um zu behandeln, die Texteingabe und die-Taste drückt, und Sie brauchen nicht zu sorgen über eine table view delegate oder Datenquelle.
Obwohl dies scheint bereits gelöst, was könnte getan haben, als "dirty hack" ist, um die gesamte Tabelle zu scrollen, bis unten, bevor eine operation ausgeführt. So etwas wie
[myTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
Diese Weise gezwungen wäre, laden Sie alle UITableCellView. Denken Sie daran, dies ist nicht die bevorzugte Methode, aber funktioniert im Fall minimale code-änderung erforderlich ist.Was passiert, ist, dass UITableView lädt nur die sichtbaren Zellen, und alle die Zeit, die UITableView gescrollt wird, wird die callback -
cellForRowAtIndexPath:
genannt wird. Aber lassen Sie mich erhalten diese gerade. Warum brauchen Sie eine UITableView, um ein Formular? Und wie ich sehen kann, sind Sie laden eine Zelle pro Abschnitt... Und Sie sind nur der Initialisierung der Zelle. Was Sie tun sollten. Unterklasse UITableViewCell und erstellen Sie Ihre Objekte.dann rufen wie diese:
Dann können Sie genau den controller, den Sie wollen. Und Sie haben, um das Verhalten Ihrer UITableView, wenn Sie gescrollt wird. wie diese:
Über den picker. Es wohl nur funktioniert, sobald Sie gescrollt haben alle Tabelle, weil Sie auf ein textField, das nur Hinzugefügt, um das Array einmal der Korrespondent der Zelle sichtbar werden.
Gibt es nicht viel mehr zu tun. Aber Folgen Sie diesem und Sie sollten in Ordnung sein. Erste Unterklasse UITableViewCell. Sie können die Steuerelemente selbst programmgesteuert oder mit einem xib. Dies wird Ihnen mehr Kontrolle über die Zellen selbst. Über die Farbauswahl, anstatt ein array mit Steuerelementen, erstellen Sie ihn mit dem Wert, den es haben sollte. Einmal hat jemand etwas eingetippt, speichern Sie Sie mit der UITextFieldDelegate.
Hoffe, es hilft.
EDIT:
Müssen Sie erstellen eine Unterklasse der UITableViewCell. Auf Xcode eine neue Datei erstellen. Wählen Sie objective-c Class. Auf dem nächsten Bildschirm, auf dem Feld Unterklasse wählen Sie UITableViewCell und nennen Sie die Zelle entsprechend. Das wird eine Klasse erstellen, die Vorrang vor den
initWithStyle:reuseIdentifier:
Methode. Innerhalb dieser Methode, dann sollten Sie Ihre init-code.wie diese: