Пользовательская ячейка UITableViewCell с использованием данных загрузки IB - PullRequest
0 голосов
/ 23 ноября 2011

Из моего другого вопроса; Использование UITableViewCell в UITableView Я использовал IB для создания пользовательской ячейки. Вот как мой код на данный момент:

ViewRoutes (Исходная таблица)

.h

@interface ViewRoutes : UIViewController {

    IBOutlet UITableView *tblRoute;
}

@property(nonatomic, retain) UITableView *tblRoute;

@end

.m

    #import "ViewRoutes.h"
#import "ViewRoutesCell.h"

@implementation ViewRoutes
@synthesize tblRoute;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}


- (NSInteger)
numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}


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


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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell * aCell = [tableView dequeueReusableCellWithIdentifier:@"ViewRoutesCell"];
    if (aCell == nil)
    {


        NSArray *arr = [[NSBundle mainBundle] loadNibNamed:@"ViewRoutesCell" owner:self options:nil];

        for (NSObject *anObj in arr) {

            if([anObj isKindOfClass:[UITableViewCell class]]) {

                aCell = (UITableViewCell *)anObj;


            }
            return aCell;
        }
    }


}

и .xib просто имеет UITableView.

ViewRoutesCell (что я хочу сделать пользовательской ячейкой)

.h

#import <UIKit/UIKit.h>

@interface ViewRoutesCell : UITableViewCell {

    IBOutlet UITableViewCell *routesCell;
    NSMutableArray *arryRouteText;
    NSMutableArray *arryRouteImage;

    IBOutlet UILabel *lblRouteText;
    IBOutlet UILabel *lblRouteImage;

}

@property (nonatomic, retain) NSMutableArray *arryRouteText;
@property (nonatomic, retain) NSMutableArray *arryRouteImage;
@property (nonatomic, retain) UILabel *lblRouteText;
@property (nonatomic, retain) UILabel *lblRouteImage;

@end

Единственное, что я сделал в пользовательской ячейке .m - это синтезировал предметы

Тогда у меня есть пользовательская ячейка:

enter image description here

enter image description here

enter image description here

Отсюда я немного застрял, я не могу понять, как установить два свойства метки из моего ViewRoutes.m (в конечном итоге они будут приходить из xml, но пока только с изменяемым массивом)

Правильно ли я делаю это?

Tom

Редактировать Просто чтобы вы знали, я сейчас загружаю строку изображения в метку, позже будет изображение

Ответы [ 4 ]

3 голосов
/ 23 ноября 2011

В декларации

UITableViewCell * aCell = [tableView dequeueReusableCellWithIdentifier:@"ViewRoutesCell"];

вы создаете UITableViewCell объект. Это не знает о ваших пользовательских метках. Вы должны изменить его на:

ViewRoutesCell * aCell = (ViewRoutesCell *)[tableView dequeueReusableCellWithIdentifier:@"ViewRoutesCell"];

Затем в предложении if вы должны изменить

aCell = (UITableViewCell *)anObj;

до

aCell = (ViewRoutesCell *)anObj;

Это заставит компилятор распознавать объект как одну из ваших определенных ячеек, позволяя вам получить доступ к свойствам метки.

Надеюсь, это поможет!

0 голосов
/ 31 декабря 2011

Вы должны установить класс ViewRoutesCell для ячейки IB как владельца файла, а затем вы можете связать эти свойства с файлом IB

0 голосов
/ 23 ноября 2011

Нет необходимости, чтобы цикл for заменял цикл for следующим кодом

acell.lblRouteText.text = [arryRouteText objectAtIndex:indexPath.row];
acell.lblRouteImage.text = [arryRouteImage objectAtIndex:indexPath.row];

return acell;

Поскольку вы поместили оператор return в цикл For, он всегда будет использовать первый объект, а остальные объектыникогда не получит шанс получить назначение.

И, вы не можете назначить изображение для метки, для этого вам придется использовать UIImageView.

0 голосов
/ 23 ноября 2011

Поскольку у вас есть определяющее свойство для UILabel, вы должны иметь @ synthesized в ViewRoutesCell.m файле.

Теперь его свойства меток легко доступны..

В вашем cellForRowAtIndexPath измените следующую часть кода.

for (NSObject *anObj in arr) {
    if([anObj isKindOfClass:[ViewRoutesCell class]]) {
        aCell = (UITableViewCell *)anObj;
        aCell.lblRouteText.text = @"My Route Text"; 
        aCell.lblRouteImage.text = @"My Route Image";
     }
     return aCell;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...