2012-12-29 21 views
5

Bu konuda yeniyim, lütfen bana katılın:UITableView'a yüklemek için IB'de oluşturulan özel UITableViewCell sınıfı nasıl edinilir?

IB içinde UITableView içeren bir UIScrollView içeren bir .xib sahibiyim. UITableView'a özel UITableViewCells yüklemek istiyorum. IB'de oluşturulan dört/beş özel hücreye sahibim, ancak doğru şekilde ilk yüklenemedi. İşte

IB alakalı ekran görüntüleri şunlardır:

Ben "itemCell" denilen oluşturulan UITableView sınıfına IB oluşturulan özel UITableViewCell için sınıf belirledik

.xib custom cell "itemCell"

. Ayrıca, üç metin alanı çıkışını ve delegeleri "itemCell" e bağladım.

#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 
İşte

olduğunu itemCell.m: filecontroller.m olarak

#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 

, rootcontroller .xib en uygulaması dosyanın ben dayalı yeni bir hücreyi oluşturmak İşte

itemCell.h olduğunu Kullanıcı bir düğmeye basarak (bir diziye ekleyin) ve ardından tablo görünümünü yeniden yükleyin. Hata alıyorum ama IB'de yarattığımın yerine normal bir hücre alıyorum. İşte rootcontroller.m. Herhangi bir yardım takdir edilir. senin

- (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!"]; 
} 

Kişisel hücrenin özelliklerinde

- (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

Bu özel hücreler yeniden kullanılacak mı (birden çok kez görüntüleniyor) veya yalnızca UITableView'ınızda bir kez mi kullanılıyor? Ayrıca UITableView bir UIScrollView üzerinde yerleşiktir, bu nedenle sizin durumunuzda UIScrollView içine UITableView koymanızın gerekmediğini düşünmüyorum. – thedeveloper3124

+0

Bu özel hücreler, birden çok kez görüntülenecektir. Kullanıcı ekleme düğmesine her bastığında, ideal olarak yeni bir satır oluşturulur ve özel hücre onu doldurur. Bence problemim IB'de olabilir. Görünüm denetleyicisinin dışında bir UITableViewCell oluşturdum. Yukarıdaki kontrolörün içinde mi yoksa o da uygun mu? Scrollview hakkında bilgi için teşekkürler. – IkegawaTaro

+0

Sınıf isimlerinin standart adlandırma kurallarına uymak için her zaman büyük harfle başlaması gerektiğini unutmayın, bu yüzden 'ItemCell' olmalıdır. Ancak, muhtemelen daha açıklayıcı bir isim düşünmek istersiniz. –

cevap

8

iOS 5 gibi bazı hatalar olabilir bu yüzden bir IDE olmadan yazdım Bir nibden bleViewCell, aşağıdaki işlevle birlikte hücre için yeniden kullanın.

- (void) registerNib: (UINib *) ucu forCellReuseIdentifier: (NSString *) tanımlayıcı

  1. Önce sadece UITableViewCell müfettiş tanımlayın
  2. Altında içeren bir IB dosyası oluşturmak emin olun: nitelikleri müfettişi altında UITableViewCell için "itemCell" enter image description here
  3. sınıfını ayarlayın: UITableViewCell tanımlayıcısını yı "itemCellIdentifier" enter image description here
  4. viewDidLoad'da: aşağıdaki kodu yerleştirin ve itemCellNibName yerine UITableViewCell öğesinin nib adıyla değiştirin. cellForRowAtIndexPath olarak

    NSString *myIdentifier = @"itemCellIdentifier"; 
    [self.tableView registerNib:[UINib nibWithNibName:@"itemCellNibName" bundle:nil] forCellReuseIdentifier:myIdentifier]; 
    
  5. : yer Aşağıdaki kod, artık IBOutlet özelliklerini Eğer itemCell üzerinde ayarlayın ve kalem ucundaki bağlı erişebilirsiniz.

    -(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; 
    } 
    

Ayrıca: Bir UIScrollView içine UITableView dahil etmek istemiyoruz, bir UIScrollView zaten düzgün hücre Queing sağlar UITableView, yerleşiktir.

Ayrıca: Bir diziden veri çekmeye başlamadan önce, önce bunun başlamasının çıplak kemiklerini almanızı öneririm.

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

Ayrıca: Başkasının sözü ettiği gibi, dizi UITableViewCells değil gerçek hücreler kendilerini dolduracaktır verileri içerir.

+0

Bu yanıt için çok teşekkür ederim. Bir sorum var. 4. Adım için Projemdeki tek "NIB" dosyası (inanıyorum) ViewController.xib. Orada bir UIViewController ve yukarıdaki resim olarak yapıştırdığım UITableViewCell [email protected] "ItemCellNibName" @ "ViewController" ile değiştirmek için kullanmam gereken NIB dosya adı mı? İlk önce temel bilgileri almak için önerilerinize göre kodu önemli ölçüde basitleştirdim. – IkegawaTaro

+0

Yapmak istediğiniz şey, her ikisini de kendi nib dosyalarına ayırmaktır. Yani UITableViewCell için bir nib oluşturmaya gidelim. Menü çubuğunda, dosya-> yeni-> dosyasına gidin. Görünen aşağı açılan pencerede, sol sütundaki Kullanıcı Arabirimi'ni seçin. "Boş" seçeneğini seçin. Cihaz Aile iPhone. Bunu itemCellNib olarak adlandırın. Bu yeni uçta, bir UITableViewCell sürükleyin ve bunun için yukarıdaki talimatları izleyin. ViewController ucunda, UITableViewCell öğesini silin. Yani NIB dosya adı için @ "itemCellNib" koyacağız – thedeveloper3124

+0

Teşekkürler! Son 30 dakika ayrı bir dosya oluşturma hakkında konuşarak başka bir site buldum. Bunu yaptım ve kodum işe yaradı. Çok yardım ettin ve uzun bir sinir bozucu gününüzü ödüllendirici bir geceye dönüştürdün. – IkegawaTaro

2

senin arayüz oluşturucu özel hücreye bağlı ne olursa olsun olabilir.

Umut eder!

1

Eh doğru değil birkaç şey vardır:

  • sınıf adı itemCell büyük harf harf ile başlar ->ItemCell
  • Sen hücreyi yeniden kullanmanız gerekir. Bunu yapmak istediğiniz şekilde, her dizin yolu için ayrı bir hücre oluşturacaksınız.
  • items dizisi yalnızca tablonun veri kaynağını içermelidir değil hücrelerinizin
  • yerine yeniden verilerini çağırmak, tablonun sadece bir satır ekleyebilir ve bu

çok hareketli olabilir

- (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: böyle bir şey deneyin Şimdi bir Uita yükleyebilirsiniz

+0

Yanıt için çok teşekkürler. Kalan sorunlar şunlardır: 1) 'cell.reuseIdentifier = CellIdentifier;' bana hata veriyor: "readonly özellik atama". 2) "Ekle" ye tıklarken "geçersiz satır sayısı" hakkında başka bir hata alıyorum. 1 olması gerektiğinde ortaya çıkan satır sayısı hala 0'dır. Herhangi bir fikir var mı? Ayrıca - Bu satır hakkında kafam karıştı: hücre = [[NSBundle mainBundle] loadNibNamed: @ "itemCell" sahibi: self options: nil] .lastObject; IB'deki tek UITableViewCell bir uç olduğunu düşündü mü? – IkegawaTaro

+0

'cell.reuseIdentifier = CellIdentifier' yapamazsınız. Bunun yerine, yeniden tanımlayıcı tanımlayıcısını 'itemCell' NIB'de ayarlayın. –

+0

Yeniden kullanım kimliği için üzgünüm Michael haklı, uçtan ayarlayın. Hata hakkında, kodunuzu çalıştırmadan, neyin yanlış olduğunu bilmiyorum. Ve bir ucu XIB uzantılı bir dosyadır, 'itemCell' için ayrı bir nib dosyası oluşturmalısınız. – Levi

İlgili konular