#ios #objective-c #arrays #uitableview
#iOS #objective-c #массивы #uitableview
Вопрос:
вот моя загадка
я пытаюсь поместить табличное представление над моим контроллером представления
представление загружается и добавляется, массив, который я использую для tableview, всегда равен нулю, поэтому таблица всегда пуста!
вот мой файл заголовка представления с моими свойствами tableview и изменяемого массива
@interface IngredientsView : UIView <UITableViewDataSource,UITableViewDelegate>
- (id)initWithFrame:(CGRect)frame andIngredients:(NSMutableArray*)ingredientsArray;
- (id)initWithIngredients:(NSMutableArray*)ingredientsArray;
@property (weak, nonatomic) IBOutlet UITableView *notesTableView;
@property NSMutableArray* ingredients;
мой пользовательский метод инициализации принимает массив и устанавливает его — вот мой пользовательский инициализация
- (id)initWithIngredients:(NSMutableArray*)ingredientsArray;
{
self.ingredients = [[NSMutableArray alloc]init];
self.ingredients=ingredientsArray;
NSLog(@"hello from init %lu", (unsigned long)[self.ingredients count]);
if (self) {
self = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", [self class]] owner:self options:nil] objectAtIndex:0];
UIImageView* view = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"ingredients background.png"]];
self.notesTableView.backgroundView=view;
self.backgroundColor = [UIColor colorWithRed:0/255.0f green:0/255.0f blue:0/255.0f alpha:0.6f];
self.notesTableView.dataSource = self;
self.notesTableView.delegate = self;
UIGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(close)];
[self addGestureRecognizer:tapGesture];
[self.notesTableView reloadData];
}
return self;
}
внутри метода init массив self.ingredients вернет количество (например, 6 объектов) в NSLog
но в моем методе представления таблицы делегата numberOfSectionsFor:index path он всегда возвращает 0, как если бы массив был равен нулю
я пробовал
- вместо этого используется массив экземпляров
- синтезируем массив и устанавливаем его из моего контроллера представления
- вставляем массив в одноэлементный элемент и извлекаем массив из одноэлементного элемента
все возвращают 0 для количества разделов?
является ли tableview нулевым?
обычно я использую контроллеры табличного представления и не имею большого опыта использования только tableviews есть ли что-то, что я пропустил?
Ответ №1:
ваша настройка self.ingredients=ingredientsArray; а затем в следующей строке установите self на кончик, который вы загружаете, перезаписывая self. Переместите назначение self.ingredients на после того, как вы установили self в значение nib.
Комментарии:
1. ах, конечно, спасибо — вот почему, что бы я ни делал, оно было стерто
Ответ №2:
Какой из ваших инициализаторов вызывается? Если вы загружаетесь из файла xib, конечно
-(id) initWithFrame:(CGRect)frame andIngredients:
не вызывается
- (id) initWithFrame:
является назначенным инициализатором для представлений. поэтому он будет вызываться при загрузке представлений из файла nib.
В любом случае, первое, что initWith...
должен сделать ваш код, это:
self = [super initWithFrame: ... ]
if (self)
{
...
}
САМАЯ критическая проблема:
Вы назначаете self = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", [self class]] owner:self options:nil] objectAtIndex:0];
Вы только что взорвали self
то, что инициализируется.
Если вы хотите IngredientsView
, чтобы его загружали из файла XIB, вы также можете рассмотреть возможность -(void) awakeFromNib {...}
установки своих свойств или установки свойств в — (self) initWithFrame: …. after calling
[super initWithFrame:rect] `