Изменяемый массив iOS всегда равен нулю

#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] `