Как Вы загружаете пользовательский UITableViewCells из файлов Xib?

Вы можете использовать функцию String.replace (char, "") в простом цикле, чтобы удалить ненужные символы и не повлиять на оставшуюся часть вашего вывода.

s='''{Television
 }{Alarm Clock
}{Lamp
    }'''
remove='{}'
for char in remove:
        s = s.replace(char, " ")

print(s)

вывод :

Television
   Alarm Clock         
Lamp                                                      
289
задан Pramod More 31 May 2018 в 19:27
поделиться

7 ответов

Вот два метода, которые, как утверждает первоначальный автор , были рекомендованы инженером IB .

Подробнее см. В фактическом сообщении. Я предпочитаю метод №2, поскольку он кажется более простым.

Метод №1:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BDCustomCell"];
    if (cell == nil) {
        // Create a temporary UIViewController to instantiate the custom cell.
        UIViewController *temporaryController = [[UIViewController alloc] initWithNibName:@"BDCustomCell" bundle:nil];
        // Grab a pointer to the custom cell.
        cell = (BDCustomCell *)temporaryController.view;
        [[cell retain] autorelease];
        // Release the temporary UIViewController.
        [temporaryController release];
    }

    return cell;
}

Метод №2:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BDCustomCell"];
    if (cell == nil) {
        // Load the top-level objects from the custom cell XIB.
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"BDCustomCell" owner:self options:nil];
        // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain).
        cell = [topLevelObjects objectAtIndex:0];
    }

    return cell;
}

Обновление (2014 г.): Метод №2 по-прежнему действителен, но для него больше нет документации. Раньше он был в официальных документах , но теперь удален в пользу раскадровок.

Я разместил рабочий пример на Github:
https://github.com/bentford/NibTableCellExample

редактировать для Swift 4.2

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    self.tblContacts.register(UINib(nibName: CellNames.ContactsCell, bundle: nil), forCellReuseIdentifier: MyIdentifier)
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: MyIdentifier, for: indexPath) as! ContactsCell

    return cell
}
287
ответ дан 23 November 2019 в 01:45
поделиться

Я не знаю, существует ли канонический путь, но здесь является моим методом:

  • Создают xib для Набора ViewController
  • Владелец Файла, класс к UIViewController
  • Удаляет представление и добавляет Набор UITableViewCell
  • Класс Вашего UITableViewCell к Вашему пользовательскому классу
  • Набор Идентификатор Вашего Набора UITableViewCell
  • выход Вашего представления контроллера представления к Вашему UITableViewCell

И использует этот код:

MyCustomViewCell *cell = (MyCustomViewCell *)[_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
  UIViewController* c = [[UIViewController alloc] initWithNibName:CellIdentifier bundle:nil];
  cell = (MyCustomViewCell *)c.view;
  [c release];
}

В Вашем примере, с помощью [1 110]

[nib objectAtIndex:0]

может повредиться, если Apple изменяет порядок пунктов в xib.

0
ответ дан Stephan Burlot 23 November 2019 в 01:45
поделиться

То, что я делаю для этого, объявляют IBOutlet UITableViewCell *cell в Вашем классе контроллера. Затем вызовите NSBundle loadNibNamed метод класса, который будет питаться UITableViewCell к ячейке, объявленной выше.

Для xib я создам пустой xib и добавлю эти UITableViewCell объект в IB, где это может быть установка по мере необходимости. Это представление затем подключено к ячейке IBOutlet в классе контроллера.

- (UITableViewCell *)tableView:(UITableView *)table
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"%@ loading RTEditableCell.xib", [self description] );

    static NSString *MyIdentifier = @"editableCellIdentifier";
    cell = [table dequeueReusableCellWithIdentifier:MyIdentifier];

    if(cell == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"RTEditableCell"
                                      owner:self
                                    options:nil];
    }

    return cell;
}

дополнения NSBundle loadNibNamed (вход в систему ADC)

статья cocoawithlove.com я получил понятие от (получите демонстрационное приложение номеров телефона)

3
ответ дан Navnath Godse 23 November 2019 в 01:45
поделиться

Вот метод класса, который я использовал для создания пользовательских ячеек из XIBs:

+ (CustomCell*) createNewCustomCellFromNib {

    NSArray* nibContents = [[NSBundle mainBundle]
                            loadNibNamed:@"CustomCell" owner:self options:NULL];

    NSEnumerator *nibEnumerator = [nibContents objectEnumerator];
    CustomCell *customCell= nil;
    NSObject* nibItem = nil;

    while ( (nibItem = [nibEnumerator nextObject]) != nil) {

        if ( [nibItem isKindOfClass: [CustomCell class]]) {
            customCell = (CustomCell*) nibItem;

            if ([customCell.reuseIdentifier isEqualToString: @"CustomCell"]) {
                break; // we have a winner
            }
            else
                fuelEntryCell = nil;
        }
    }
    return customCell;
}

Затем в XIB, я установил имя класса и идентификатор повторного использования. После этого я могу просто назвать тот метод, по моему мнению, контроллером вместо

[[UITableViewCell] alloc] initWithFrame:]

, Это - много достаточно быстро, и используемый в двух из моих приложений поставки. Это более надежно, чем вызов [nib objectAtIndex:0], и в моем уме, по крайней мере, более надежно, чем пример Stephan Burlot, потому что Вы, как гарантируют, только захватите представление из XIB, который является правильным типом.

6
ответ дан Navnath Godse 23 November 2019 в 01:45
поделиться

Загрузка UITableViewCells от XIBs сохраняет много кода, но обычно приводит к ужасной скорости прокрутки (на самом деле, это не XIB, но чрезмерное использование UIViews, которые вызывают это).

я предлагаю, чтобы Вы смотрели на это: ссылка Ссылки

8
ответ дан Nagarjun 23 November 2019 в 01:45
поделиться

Если вы используете Interface Builder для создания ячеек, убедитесь, что вы установили идентификатор в инспекторе. Затем проверьте, что то же самое при вызове dequeueReusableCellWithIdentifier.

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

9
ответ дан 23 November 2019 в 01:45
поделиться

Взял ответ Шона Крейвера и немного почистил его.

BBCell.h:

#import <UIKit/UIKit.h>

@interface BBCell : UITableViewCell {
}

+ (BBCell *)cellFromNibNamed:(NSString *)nibName;

@end

BBCell.m:

#import "BBCell.h"

@implementation BBCell

+ (BBCell *)cellFromNibNamed:(NSString *)nibName {
    NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:NULL];
    NSEnumerator *nibEnumerator = [nibContents objectEnumerator];
    BBCell *customCell = nil;
    NSObject* nibItem = nil;
    while ((nibItem = [nibEnumerator nextObject]) != nil) {
        if ([nibItem isKindOfClass:[BBCell class]]) {
            customCell = (BBCell *)nibItem;
            break; // we have a winner
        }
    }
    return customCell;
}

@end

Я делаю все свои подклассы UITableViewCell подклассами BBCell, а затем заменяю стандартный

cell = [[[BBDetailCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"BBDetailCell"] autorelease];

на:

cell = (BBDetailCell *)[BBDetailCell cellFromNibNamed:@"BBDetailCell"];
33
ответ дан 23 November 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: