Pertanyaan Banyak UITableViewCells yang berbeda dalam satu TableView


Saya punya NSDictionary yang akan kami katakan adalah seperti ini:

key:       value:
name       Bookshelf
movies     Array containing: (Movie 1, Movie 2, Movie 3)
books      Array containing: (Book 1, Book 2, Book 3)
music      Array containing: (Music 1, Music 2, Music 3)

Dan seterusnya. Sekarang yang saya coba lakukan adalah membuat tableView yang menampilkan semua informasi ini, tetapi dengan berbagai jenis sel berdasarkan pada apa kunci kamus itu. Misalnya, film digunakan cellForMovies buku digunakan cellForBooks penggunaan musik cellForMusic, masing-masing memiliki tata letaknya sendiri.

Tentunya, saya terlalu menyederhanakan, tetapi semoga Anda mengerti apa yang saya coba lakukan.

Saya dapat menyelesaikan ini jika saya melakukan bagian dan jenis sel yang berbeda untuk setiap bagian, tetapi saya tidak ingin melakukan itu. Saya ingin bisa memiliki meja seperti ini, misalnya:

cellForBooks
cellForMovies
cellForMovies
cellForMusic
cellForBooks

dan seterusnya ... Ada gagasan atau sumber daya yang dapat Anda tunjukkan kepada saya? Saya hanya peduli dengan dukungan iOS 5 (papan cerita).

Edit dengan solusi:

Terima kasih banyak kepada semua orang yang telah membantu, terutama atticus yang membuat bagian akhir bersama.

Apa yang akhirnya berhasil adalah mengubah struktur data menjadi array kamus dan kemudian menambahkan Key: type Value: book/movie/music untuk setiap entri. Struktur data sekarang terlihat seperti:

Array[0]: Dictionary: [Key: type Value: book], [Key: name Value: Physics];
Array[1]: Dictionary: [Key: type Value: music], [Key: name Value: Rock];

Kemudian untuk mengkonfigurasi sel, saya melakukan ini:

NSString *CellIdentifier = @"Cell";
NSDictionary *object = [self.listOfStuff objectAtIndex:indexPath.row];
if ([[object objectForKey:@"type"] isEqualToString:@"book"]){
    CellIdentifier = @"BookCell";
}else if ([[object objectForKey:@"type"] isEqualToString:@"music"]){
    CellIdentifier = @"MusicCell";
}else if ([[object objectForKey:@"type"] isEqualToString:@"movie"]){
    CellIdentifier = @"MovieCell";
}

masing-masing memiliki tampilan tabel berbeda di storyboard. Kami tahu jika Anda ingin menggunakan salah satu fitur sel built-in, seperti cell.textLabel.text Anda perlu melakukan ini:

cell.textLabel.text = [object objectForKey:@"name"];
cell.textLabel.backgroundColor = [UIColor clearColor]; 
cell.textLabel.opaque = NO;

Semoga ini membantu orang lain di masa depan.


5
2018-04-12 02:28


asal


Jawaban:


Di dalam Anda - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath metode Anda dapat mengembalikan banyak jenis sel menurut indexPath.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row > 5) { // Your conditions here to choose between Books and Movies
        BookCell *cell = [tableView dequeueReusableCellWithIdentifier:@"bookCell"];
        if (!cell)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault     reuseIdentifier:@"bookCell"];
        }
        return cell;
    } else {
        MovieCell *cell = [tableView dequeueReusableCellWithIdentifier:@"movieCell"];
        if (!cell)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault     reuseIdentifier:@"movieCell"];
        }
        return cell;
    }
return nil;
}

6
2018-04-12 02:38



Terima kasih banyak kepada semua orang yang telah membantu, terutama atticus yang membuat bagian akhir bersama.

Apa yang akhirnya berhasil adalah mengubah struktur data menjadi array kamus dan kemudian menambahkan Key: type Value: book/movie/music untuk setiap entri. Struktur data sekarang terlihat seperti:

Array[0]: Dictionary: [Key: type Value: book], [Key: name Value: Physics];
Array[1]: Dictionary: [Key: type Value: music], [Key: name Value: Rock];

Kemudian untuk mengkonfigurasi sel, saya melakukan ini:

NSString *CellIdentifier = @"Cell";
NSDictionary *object = [self.listOfStuff objectAtIndex:indexPath.row];
if ([[object objectForKey:@"type"] isEqualToString:@"book"]){
    CellIdentifier = @"BookCell";
}else if ([[object objectForKey:@"type"] isEqualToString:@"music"]){
    CellIdentifier = @"MusicCell";
}else if ([[object objectForKey:@"type"] isEqualToString:@"movie"]){
    CellIdentifier = @"MovieCell";
}

masing-masing memiliki tampilan tabel berbeda di storyboard. Kami tahu jika Anda ingin menggunakan salah satu fitur sel built-in, seperti cell.textLabel.text Anda perlu melakukan ini:

cell.textLabel.text = [object objectForKey:@"name"];
cell.textLabel.backgroundColor = [UIColor clearColor]; 
cell.textLabel.opaque = NO;

Semoga ini membantu orang lain di masa depan.


6
2018-06-11 14:57



Di papan cerita Anda, atur tableView Anda untuk menggunakan Prototipe Dinamis. Kemudian, buat sel untuk setiap jenis sel yang akan Anda gunakan. Ubahsuaikan dengan tepat, lalu beri masing-masing Pengidentifikasi Reuse unik di inspektur (mis. MovieCell).

Kemudian, di tampilan tabel Anda: cellForRowAtIndexPath: metode, tentukan jenis sel yang sesuai untuk konten pada jalur indeks tersebut. Jika sel pada indexPath harus sel film, Anda akan membuat sel menggunakan:

static NSString * MovieCellIdentifier = @"MovieCell"; // This must match the storyboard
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MovieCellIdentifier];

Itu akan memberi Anda sel yang Anda tentukan sebagai "MovieCell" di papan cerita Anda. Jika Anda perlu menyesuaikannya lebih lanjut, buat subclass UITableViewCell dan tentukan bahwa untuk sel di Storyboard. Kemudian, Anda dapat merujuk ke properti dll di sini untuk penyesuaian dengan mentransmisikan sel yang dikembalikan:

MovieTableViewCell *movieCell = (MovieTableViewCell *)cell;
// customize

3
2018-04-12 02:43



Pendapat saya adalah Anda harus mengimplementasikan semua tipe sel Anda dalam satu sel. Yang berarti Anda harus memilikinya UITableViewCell kelas dan .xib untuk semuanya. Kemudian di cellForRowAtIndexPath, buat sel, lalu tergantung pada persyaratan sebenarnya, tampilkan / sembunyikan sublihat yang membentuk buku atau film.

Dalam desain seperti itu, sel Anda akan menjadi kelas berat. Namun, masih lebih baik daripada menggunakan beberapa kelas sel karena cara penggunaan kembali sel ini lebih efisien ([UITableView dequeueReusableCellWithIdentifier]).

Saya yakin UITableView dirancang untuk satu jenis sel. Jadi jika tata letak Anda bervariasi, Anda masih dapat menempatkannya di satu tempat dan menggunakan bingkai atau tampilkan / sembunyikan untuk mengontrol perilaku sel.


0
2018-04-12 02:43



Saya pikir Anda harus menggunakan yang berikut ini sebagai pengidentifikasi sel Anda.

- (UITableViewCell *)tableView:(UITableView *)tmpTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
NSString *cellIdentifier            =   [NSString stringWithFormat:@"Cell%d%d",indexPath.section,indexPath.row];
UITableViewCell *cell               =   [tmpTableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
if (nil == cell) {
    cell    =   [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];

// do ur stuff here

}
return cell;
}

0
2018-04-12 05:13