Загрузка UITableView из пера - PullRequest
1 голос
/ 01 апреля 2010

Я получаю сбой при загрузке UITableView. Я пытаюсь использовать ячейку, определенную в файле пера.

У меня есть IBOutlet, определенный в заголовочном файле контроллера представления:

UITableViewCell *jobCell;
@property (nonatomic, assign) IBOutlet UITableViewCell *jobCell;

Это синтезировано в файле реализации.

У меня UITableViewCell, созданный в IB, и для его идентификатора задано значение JobCell.

Вот метод cellForRowAtIndexPath:

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

static NSString *cellIdentifier = @"JobCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"JobsRootViewController" owner:self options:nil];
    cell = jobCell;
    self.jobCell = nil;
}

// Get this job
Job *job = [fetchedResultsController objectAtIndexPath:indexPath];

// Job title
UILabel *jobTitle;
jobTitle = (UILabel *)[cell viewWithTag:tagJobTitle];
jobTitle.text = job.title;

// Job due date
UILabel *dueDate;
dueDate = (UILabel *)[cell viewWithTag:tagJobDueDate];
dueDate.text = [self.dateFormatter stringFromDate:job.dueDate];

// Notes icon
UIImageView *notesImageView;
notesImageView = (UIImageView *)[cell viewWithTag:tagNotesImageView];
if ([job.notes length] > 0) {
    // This job has a note attached to it - show the notes icon
    notesImageView.hidden = NO;
}
else {
    // Hide the notes icon
    notesImageView.hidden = YES;
}

// Job completed button

// Return the cell
return cell;

}

Когда я запускаю приложение - у меня происходит серьезный сбой, и консоль сообщает следующее:

objc [1291]: FREED (id): стиль сообщения, отправленный освобожденному объекту = 0x4046400

Я правильно подключил все розетки в IB. В чем проблема?

Спасибо

Ответы [ 3 ]

0 голосов
/ 02 апреля 2010

Самый простой способ сделать это - разбить его на два отдельных файла пера и загрузить ячейку из собственного пера ячейки. Стоит отметить, что вы не можете устанавливать такие выходы, если вы хотите это сделать, вам понадобится пользовательский подкласс UITableViewCell. Но если вы ничего не подключаете в камере, вы можете просто сделать это:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
    cell = [[[NSBundle mainBundle] loadNibNamed:@"JobsRootViewCell" owner:nil options:nil] objectAtIndex:0];
}
0 голосов
/ 05 апреля 2017

Swift 3

  • Сотовый

Вам необходимо зарегистрировать свой файл xib для использования в tableView:

override func viewDidLoad() {
        super.viewDidLoad()
        tableView.registerNib(UINib(nibName: "CellXibName", bundle: nil), forCellReuseIdentifier: "CellReuseIdentifier")
    }

Метод UITebleViewDataSource:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("CellReuseIdentifier", forIndexPath: indexPath) as! CellClass
    return cell
}

TableView

if let tableView: CustomTableView = nib?.first as? CustomTableView 
{
   self.view.addSubview(tableView)
}
0 голосов
/ 01 апреля 2010

Ваша проблема в этом блоке:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"JobsRootViewController" owner:self options:nil];
    cell = jobCell; <- THIS IS A SHALLOW COPY
    self.jobCell = nil; <- YOU JUST RELEASED IT
}

// Get this job
Job *job = [fetchedResultsController objectAtIndexPath:indexPath];

// Job title
UILabel *jobTitle;
jobTitle = (UILabel *)[cell viewWithTag:tagJobTitle]; <- CELL ISNT THERE ANYMORE

Вы создаете jobCell как назначенное свойство. Синтезированный сеттер, который вы используете, когда говорите self.jobCell = nil, освобождает объект, на который вы только что сделали ссылку на ячейку. Вместо этого сделайте глубокую копию или не устанавливайте для jobCell значение nil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...