2012-12-29 8 views
5

Jestem nowy w tym celu, proszę o zebranie:Jak uzyskać niestandardową klasę UITableViewCell utworzoną w IB, aby załadować do UITableView?

Mam. XIB w IB zawierający UIScrollView, który ma osadzony w nim UITableView. Chciałbym załadować niestandardowe UITableViewCells do UITableView. Mam cztery/pięć niestandardowych komórek utworzonych w IB, ale nie mogę uzyskać pierwszego, który poprawnie się załaduje.

Oto odpowiednie screeny z IB:

.xib custom cell "itemCell"

mam ustawić klasę na niestandardowej UITableViewCell utworzonego w IB do klasy UITableView stworzyłem nazwie "itemCell". Dodatkowo połączyłem trzy pola tekstowe i delegatów do "itemCell".

Oto itemCell.h:

#import <UIKit/UIKit.h> 

@interface itemCell : UITableViewCell 
@property (weak, nonatomic) IBOutlet UITextField *quantityTextField; 
@property (weak, nonatomic) IBOutlet UITextField *itemTextField; 
@property (weak, nonatomic) IBOutlet UITextField *priceTextField; 

@end 

Oto itemCell.m:

#import "itemCell.h" 

@implementation itemCell 
@synthesize quantityTextField,itemTextField,priceTextField; 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     // Initialization code 

    } 
    return self; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ 
    [super setSelected:selected animated:animated]; 

    // Configure the view for the selected state 
} 

@end 

W filecontroller.m, który jest plik wdrażania rootcontroller .xib za utworzyć nową komórkę w oparciu o użytkownik naciska przycisk (dodaje go do tablicy), a następnie ponownie ładuje widok tabeli. Nie otrzymuję żadnych błędów, ale otrzymuję raczej normalną komórkę niż to, co stworzyłem w IB. Tutaj jest rootcontroller.m. Każda pomoc jest doceniana.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    scrollView =(UIScrollView *)self.view; 
    items = [[NSMutableArray alloc] init]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return [items count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
     return [items objectAtIndex:[indexPath row]]; 
} 

- (UITableViewCell *)initiateNewCell{ 
    itemCell *cell = [[itemCell alloc] init]; 
    cell.accessoryType = UITableViewCellAccessoryNone; 
    cell.selectionStyle = UITableViewCellSelectionStyleBlue; 
    return cell; 
} 

- (IBAction)addItem:(id)sender { 
    //creates the new cell to be added 
    [items addObject:[self initiateNewCell]]; 
    [self.tableView reloadData]; 
+0

Czy te niestandardowe komórki będą ponownie używane (wyświetlane wiele razy) lub używane tylko raz w swoim widoku UITableView? Również UITableView jest zbudowany na UIScrollView, więc w twojej sytuacji nie myślę, że istnieje potrzeba umieszczenia UITableView wewnątrz UIScrollView. – thedeveloper3124

+0

Te niestandardowe komórki będą wyświetlane wiele razy. Za każdym razem, gdy użytkownik kliknie przycisk Dodaj, idealnie nowy wiersz zostanie utworzony, a niestandardowa komórka zapełni go. Myślę, że mój problem może leżeć w IB. Stworzyłem UITableViewCell poza kontrolerem viewcontroller. Powinien on znajdować się wewnątrz kontrolera viewcontroller powyżej lub jest to nieistotne. Dziękuję za informacje na temat przewijania. – IkegawaTaro

+0

Po prostu zwróć uwagę, że nazwy klas powinny zawsze zaczynać się od dużej litery, zgodnie ze standardowymi konwencjami nazewnictwa, więc naprawdę powinno to być "ItemCell". Prawdopodobnie jednak warto rozważyć bardziej opisową nazwę. –

Odpowiedz

8

w iOS 5 można teraz załadować Uita bleViewCell ze stalówki dla ponownego użycia komórki z następującą funkcją.

- (void) registerNib: (UINib *) stalówka forCellReuseIdentifier: (NSString *) identyfikator

  1. Najpierw upewnij się utworzyć plik IB, który zawiera tylko UITableViewCell
  2. Pod Zidentyfikuj inspektora: Ustaw klasę UITableViewCell do „itemCell” enter image description here
  3. Pod atrybutami inspektora: Ustaw identyfikator UITableViewCell do „itemCellIdentifier” enter image description here
  4. W viewDidLoad: umieść poniższy kod i zastąp itemCellNibName nazwą stalówki zawierającej UITableViewCell.

    NSString *myIdentifier = @"itemCellIdentifier"; 
    [self.tableView registerNib:[UINib nibWithNibName:@"itemCellNibName" bundle:nil] forCellReuseIdentifier:myIdentifier]; 
    
  5. W cellForRowAtIndexPath: miejsce następujący kod, można uzyskać dostęp do właściwości IBOutlet ustawione na itemCell i połączonych stalówki.

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
    { 
        static NSString *myIdentifier = @"itemCellIdentifier"; 
    
        itemCell *cell = (itemCell *)[tableView dequeueReusableCellWithIdentifier:myIdentifier]; 
        cell.textLabel.text = [NSString stringWithFormat:@"Test Row:%i!",indexPath.row]; 
        return cell; 
    } 
    

także: Nie chcesz dołączyć UITableView wewnątrz UIScrollView, A UIScrollView jest już wbudowany w UITableView, który pozwala na prawidłowe kolejce komórkowej.

Ponadto: Proponuję po prostu uzyskać gołe kości tego, zanim zaczniesz pobierać dane z tablicy.

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

również: Jak ktoś inny wspomniał, tablica zawiera dane, które będą wypełniać UITableViewCells, a nie rzeczywiste samych komórek.

+0

Dziękuję bardzo za tę odpowiedź. Mam jedno pytanie. Do kroku 4. Jedynym plikiem "NIB" (moim zdaniem) w moim projekcie jest ViewController.xib. Jest tam UIViewController i UITableViewCell, które wkleiłem jako obrazy powyżej.Czy nazwa pliku NIB, którego powinienem użyć, aby zastąpić @ "itemCellNibName" @ "ViewController"? Uprośniłem kod znacznie zgodnie z twoją rekomendacją, aby najpierw uzyskać podstawowe informacje. – IkegawaTaro

+0

Cóż, co chcesz zrobić, to oddzielić oba do własnych plików. Więc przejdźmy do stworzenia końcówki dla UITableViewCell. Na pasku menu przejdź do pliku-> nowy-> plik. W wyświetlonym oknie rozwijanym wybierz opcję Interfejs użytkownika w lewej kolumnie. Wybierz opcję "Opróżnij". IPhone urządzenia iPhone. Nazwij go itemCellNib. W nowym stalowcu przeciągnij w UITableViewCell i postępuj zgodnie z powyższymi instrukcjami. W końcówce ViewController usuń z niej obiekt UITableViewCell. Tak więc dla nazwy pliku NIB wstawisz @ itemCellNib " – thedeveloper3124

+0

Dzięki! w ciągu ostatnich 30 minut znalazłem inną stronę mówiącą o tworzeniu oddzielnych plików końcówek - zrobiłem to i sprawiłem, że mój kod zadziałał. Byłaś wielką pomocą i sprawiłeś, że to był długi, frustrujący dzień w pełną satysfakcji noc. – IkegawaTaro

2

We właściwościach Twojego

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    //This identifier string needs to be set in cell of the TableViewController in the storyboard 
    static NSString *CellIdentifier = @"Cell"; 

    // Resuse the cell 
    SomeCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    // If there are no cell to be reused we create a new one 
    if(cell == nil) { 
     cell = [SomeCustomCell new]; 
    } 

    // Configure the cell... 
    NSString *someString = [yourArrayWithStringsOrWhatEver objectAtIndex:indexPath.row]; 

    // Setting the some property of your custom cell 
    [cell.yourSpecificCellProperty someString]; 

    [cell.yourOtherSpecificCellProperty setText:@"What Ever your want!"]; 
} 

komórki mogłoby być bez względu na podłączeniu do niestandardowego komórki w interfejsie konstruktora.

Mam nadzieję, że pomoże!

1

Otóż istnieje kilka rzeczy, które nie są w porządku:

  • Nazwa klasy rozpoczyna się wielką literą itemCell ->ItemCell
  • Należy ponownie wykorzystać komórkę. W sposób, w jaki chcesz to zrobić, utworzysz osobną komórkę dla każdej ścieżki indeksu.
  • tablica items powinna zawierać tylko źródła danych z tabeli, a nie twoje komórki
  • zamiast nazywać dane przeładować, można dodać tylko jeden wiersz w tabeli, a to może być animowany zbyt

Spróbuj czegoś takiego:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    scrollView =(UIScrollView *)self.view; 
    items = [[NSMutableArray alloc] init]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return [items count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (!cell) { 
     cell = [[NSBundle mainBundle] loadNibNamed:@"itemCell" owner:self options:nil].lastObject; 
     cell.reuseIdentifier = CellIdentifier; 
    } 

    // Do any additional setup to the cell 

    return cell; 
} 

- (IBAction)addItem:(id)sender { 
    [items addObject:[NSNumber numberWithInt:items.count]]; // Here comes the data source 
    [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:items.count - 1 inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic]; 
} 

PS: napisałem go bez IDE, więc nie może być pewne błędy

+0

Dziękuję za odpowiedź. Pozostałe problemy to: 1) 'cell.reuseIdentifier = CellIdentifier;' daje mi błąd: "przypisanie do własności tylko do odczytu". 2) Po kliknięciu "dodaj" pojawia się kolejny błąd dotyczący "nieprawidłowej liczby wierszy". Wygląda na to, że wynikowa liczba wierszy nadal wynosi 0, gdy powinna wynosić 1. Jakieś pomysły? Dodatkowo - jestem zdezorientowany na temat tej linii: cell = [[NSBundle mainBundle] loadNibNamed: @ "itemCell" owner: self options: nil] .lastObject; Czy pojedyncza UITableViewCell w IB jest uznawana za stalówkę? – IkegawaTaro

+0

Nie można wykonać 'cell.reuseIdentifier = CellIdentifier'. Zamiast tego ustaw identyfikator ponownego użycia w NIB "itemCell". –

+0

Przepraszam za identyfikator ponownego użycia, Michael ma rację, ustaw go ze stalówki. O błędzie, bez uruchamiania kodu, nie wiem, co jest z nim nie tak. A stalówka to plik z rozszerzeniem XIB, powinieneś stworzyć dla 'itemCell' oddzielny plik stalówki. – Levi

Powiązane problemy