UITableView beberapa pilihan. memilih baris acak secara otomatis dengan baris yang dipilih

Saya memiliki 30 baris dalam tampilan yang sesuai dan saya mencoba memilih beberapa baris dan mengaturnya untuk dicentang.

Setiap kali saya memilih satu baris, secara otomatis baris lain dipilih dan dicentang dengan baris yang diinginkan.

Juga ketika saya menggulir tampilan tabel, itu mengubah pilihan secara otomatis.

Saya telah menggunakan kode ini dengan jumlah baris lebih sedikit (8) dan berfungsi dengan baik. Untuk lebih dari 12 baris itu memberikan masalah yang telah saya jelaskan.

Jika Anda dapat menyarankan kode/tutorial lain untuk membuatnya berfungsi juga tidak masalah.

Saya baru mengenal xcode, bantuan apa pun sangat kami hargai. Terima kasih.

Ini kode saya:

#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return [listOfItems count];
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

// Configure the cell...
NSString *cellValue = [listOfItems objectAtIndex:indexPath.row];
cell.text = cellValue;

return cell;
}

#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];

if ([selectedCell accessoryType] == UITableViewCellAccessoryNone) {

    if(count < 3)
    {

        [selectedCell setAccessoryType:UITableViewCellAccessoryCheckmark];
        [selectedIndexes addObject:[NSNumber numberWithInt:indexPath.row]];
        count++;
    }

    NSLog(@"Count: %d", count);
    NSLog(@"Items I selected @ %d:", indexPath.row);
    NSLog(@"Items I selected: %@", selectedIndexes);
} 

else {

    [selectedCell setAccessoryType:UITableViewCellAccessoryNone];
    [selectedIndexes removeObject:[NSNumber numberWithInt:indexPath.row]];
    count --;
    NSLog(@"Items I de-selected @ %d:", indexPath.row);

}

[tableView deselectRowAtIndexPath:indexPath animated:NO];

NSMutableString *resultlearning = [[NSMutableString alloc]init];
for (int i = 0; i < [listOfItems count]; i++) {
    NSIndexPath *path = [NSIndexPath indexPathForRow:i inSection:0];
    //[tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:path];
    if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
        [resultlearning appendFormat:@"%@, ",cell.textLabel.text];
    }
}
if (resultlearning.length > 2) {
    [resultlearning replaceCharactersInRange:NSMakeRange(resultlearning.length-1, 1) withString:@""];
}
NSLog(@"Result: %@",resultlearning);
}

person Sanjyot Shah    schedule 25.07.2012    source sumber


Jawaban (4)


Tambahkan satu mutablearray di file .h. Di sini tambahkan objek ke array sebanyak yang dimiliki array tableDataSourc Anda. Sekarang maksud saya adalah jika berisi 0 maka sel itu tidak dipilih atau berisi 1 maka sel itu dipilih

Sekarang lakukan ini karena Anda telah memilih array Indeks sehingga memerlukan mutablearray lain:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
for(int i = 0;i<[listOfItems count];i++)
{
[selectedIndexes addObject:@"0"];
}
   return [listOfItems count]
 }


 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

 UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];

 if ([selectedCell accessoryType] == UITableViewCellAccessoryNone) {

     [selectedCell setAccessoryType:UITableViewCellAccessoryCheckmark];
     [selectedIndexes replaceObjectAtIndex:indexPath.row withObject:@"1"];
}
else
{          
selectedCell.accessoryType = UITableViewCellAccessoryNone;
[selectedIndexes replaceObjectAtIndex:indexPath.row withObject:@"0"];
}

Sekarang SelectIndexes memiliki objek dengan 1 nilai berarti nilai tersebut dipilih di listOfItems

person Paresh Navadiya    schedule 25.07.2012
comment
hai, jadi SelectedIndexes adalah array lain yang bisa diubah yang Anda ingin saya nyatakan atau haruskah saya menambahkan satu lagi selain SelectedIndexes? - person Sanjyot Shah; 25.07.2012
comment
Anda tidak perlu menambahkan array lain yang bisa berubah karena saya berasumsi Anda telah memilih array Indeks dan jika tidak maka tambahkan array yang bisa berubah dan alokasikan dalam metode viewDidLoad - person Paresh Navadiya; 26.07.2012

Sel disimpan dalam cache dan digunakan kembali sehingga jika Anda mengatur aksesori pada satu sel dan kemudian digunakan untuk lokasi berbeda dalam tabel, sel tersebut masih memiliki aksesori tersebut.

Lebih baik hanya melacak sel mana yang dipilih sebagai data dalam metode didSelectRowAtIndexPath: dan kemudian menghidupkan atau mematikan aksesori untuk semua sel di cellForRowAtIndexPath:.

person Phillip Mills    schedule 25.07.2012
comment
Oke, maksud Anda saya harus menyimpan indeks dalam array dan kemudian menggunakan array untuk mengaktifkan atau menonaktifkan aksesori? Bisakah Anda mendemonstrasikannya menggunakan blok kode? - person Sanjyot Shah; 25.07.2012
comment
atau jika Anda dapat mengeditnya di postingan saya, itu bagus sekali. Terima kasih dan maaf atas masalahnya, saya baru mengenal xcode. - person Sanjyot Shah; 25.07.2012

Logika centang/hapus centang jenis sel aksesori harus menuju ke cellForRowAtindexPath. Di didSelectRowAtIndexPath, Anda hanya boleh menangani baris yang dipilih.

person Apurv    schedule 25.07.2012

Hmm...Saya masih menikmati secangkir kopi pertama saya pagi ini, tetapi ada yang memberitahu saya bahwa Anda sudah memiliki baris "dipilih" ketika didSelectRowAtIndexPath dipanggil. Maka sepertinya pernyataan if melakukan sesuatu yang funky dan memilih baris berikutnya atau semacamnya. Sudahkah Anda mencoba mengomentari pernyataan if? Saya tahu itu mungkin hanya akan memilih satu pada satu waktu, tetapi hanya untuk melihat apakah itu penyebabnya. Juga, apakah baris berikutnya yang dipilih, baris sebelumnya?

person Indy-Jones    schedule 25.07.2012
comment
Saya mencoba berkomentar. Tidak ada baris yang dipilih sebelumnya. Dan bukan, ini bukan baris yang dipilih sebelumnya. Pilihannya juga berubah secara otomatis saat saya menggulir ke bawah atau ke atas dan kembali untuk melihat pilihan. Saya pikir ada kesalahan besar dalam logika saya. Jika Anda dapat menyarankan logika atau kode lain, itu juga tidak masalah. Yang ingin saya lakukan adalah, memiliki 30 baris di tabel saya dan dapat memilih maksimum 3 dari 30 baris dan menerapkan pemeriksaan pada baris yang dipilih dan menyimpan baris centang dalam satu variabel string. - person Sanjyot Shah; 25.07.2012