Хобрук: Ваш путь к мастерству в программировании

UIPickerView в UITableViewCell не загружает данные

У меня есть UITableView с UITableViewDelegate.

Один из CellTypes состоит из метки и UITextField.

Я установил inputView из UITextField на UIPickerView.

UIPickerView и его делегат создаются в функции cellForRowAtIndexPath класса UITableViewDelegate.

Когда я показываю свою таблицу, создаются таблицы, когда я нажимаю на UITextField, появляется средство выбора, однако средство выбора не заполняется, а журналы, которые я поместил в делегат, не отображаются.

До сих пор я пробовал несколько вещей, таких как добавление дополнительного обновления, но пока безрезультатно.

Поскольку журналы не отображаются, я подозреваю, что что-то не так со ссылкой на делегата и источник данных? Экземпляр PickerView где-то уничтожен? Может быть, я забыл реализовать метод, которого не вижу?

Любая помощь в понимании/исправлении этого приветствуется!

Скриншот:

скриншот

В моем коде это выглядит так:

TableViewDelegate.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = nil;
    cell = [self createListViewCell:indexPath tableView:tableView];
    return cell;
}

- (UITableViewCell *) createListViewCell:(NSIndexPath *)indexPath tableView:(UITableView *)tableView {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:LIST_CELL_ID];
    ListTableCell *listTableCell = (ListTableCell *) cell;
    List *list = [listsData objectAtIndex:indexPath.row];

    //Set List Label
    listTableCell.listLabel.text = list.name;

    //Create Value picker
    UIPickerView *picker = [[UIPickerView alloc]init];
    //Create Delegate for picker
    ListPickerViewDelegate *pickerDelegate = [[ListPickerViewDelegate alloc]init];

    pickerDelegate.data=list.itemData;

    picker.dataSource = pickerDelegate;
    picker.delegate = pickerDelegate;

    listTableCell.listTextValue.inputView = picker;
    [picker reloadAllComponents];

    return cell;
}

И мой ListPickerViewDelegate выглядит так:

ListPickerViewDelegate.h

#import <UIKit/UIKit.h>

@interface ListPickerViewDelegate:NSObject <UIPickerViewDelegate,UIPickerViewDataSource>

@property (nonatomic) NSArray *data;
@property (nonatomic) UITextField *textField;

@end

ListPickerViewDelegate.m

#import "ListPickerViewDelegate.h"
#import "DataItem.h"

@implementation TagListPickerViewDelegate
@synthesize data;

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    DataItem *thisDataItem = [data objectAtIndex:row];
    NSLog(@"Value for row is %@", thisDataItem.name ); //Log not showing

    return DataItem.name;
}

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    return 1;
}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    NSLog(@"Count for data is %li", (unsigned long)[data count]); //Log not showing
    return [data count];
}
@end

  • Где у вашего сборщика координаты и рамка? 23.11.2015
  • Средство выбора — это то, что отображается в нижней части экрана на скриншоте. Нужно ли для этого предоставлять дополнительные справки? 23.11.2015
  • Тогда где это надо делать? Я пытаюсь добиться того, что объяснено здесь: stackoverflow.com/a/20438343/3708094 23.11.2015

Ответы:


1

Свойства delegate и datasource на UIPickerView определены weak. Ваш объект ListPickerViewDelegate определяется в рамках метода createListViewCell:tableView:, поэтому он никогда не сохраняется.

Попробуйте создать сильное свойство внутри вашего TableViewDelegate для ListPickerViewDelegate и инициализировать его в другом месте (возможно, в перегруженном методе init). Затем просто назначьте UIPickerView delegate и datasource этому свойству.

23.11.2015
  • Спасибо за это ясное объяснение, я попытаюсь сохранить список PickerViewDelegates внутри моего TableViewDelegate и ссылаться на них. Если это сработает, я отмечу этот ответ как принятый :) 23.11.2015
  • Новые материалы

    Получение стоковых обновлений с помощью Python
    Для начинающего финансового аналитика Введение Описание: Этот проект Python создает скрипт для получения текущих обновлений акций с финансового веб-сайта Yahoo. Для этого проекта мы..

    Это все, что вам нужно знать о Kotlin в 2022 году
    Добро пожаловать! Kotlin — это язык программирования, популярность которого, кажется, растет, его действительно можно использовать для создания чего угодно, и если вы хотите узнать о Kotlin,..

    Текстовый графический интерфейс с Lanterna на Java
    Мой опыт работы с компьютерами (и текстовыми графическими пользовательскими интерфейсами) начался еще в восьмидесятых, когда я был ребенком, на дне рождения друга. Это был «новенький» Amstrad..

    Перезарядите свой мозг: умопомрачительный потенциал мозговых компьютерных интерфейсов
    Способность читать свои мысли и управлять объектами разумом долгое время были предметом человеческого любопытства, ограниченного областью научной фантастики… то есть до сих пор? С технологией,..

    Основы C# — Нулевой оператор объединения (??)
    Оператор ?? называется null-coalescing operator . Этот оператор используется для предоставления значения по умолчанию, если значение операнда в левой части оператора равно null ...

    Сравнение номеров версий в C++ с использованием синтаксического анализа строк
    Номера версий обычно используются для обозначения развития или обновлений программного обеспечения или любого другого продукта. При работе с номерами версий в C++ может быть полезно сравнить две..

    В мир искусственного интеллекта…
    ИИ — это новое топливо в современном мире. Куда бы вы ни обратились, с кем бы вы ни разговаривали — они, как правило, упоминают об ИИ хотя бы раз в ходе разговора. ИИ гудит повсюду. У каждого..