Заполните NSStackView с помощью NSArray и NSMutableArray

У меня есть стек для заполнения массивом представлений.

_countViewArray = [[NSArray alloc] init];
_countViewArray = @[self.a.view,self.b.view,self.c.view];
_stackView = [NSStackView stackViewWithViews:_countViewArray];

Это хорошо работает. Если я хочу заменить этот массив изменяемым массивом, как это сделать?

Я попробовал этот код для «динамического» представления стека и, наконец, преобразовал изменяемый массив в простой массив, но не работает:

_mutableCountViewArray = [[NSMutableArray alloc] init];

[_mutableCountViewArray addObject:@[self.a.view]];
if (caseCondition){
   [_mutableCountViewArray addObject:@[self.b.view]];
}
[_mutableCountViewArray addObject:@[self.c.view]];

_countViewArray = [_mutableCountViewArray copy];
_stackView = [NSStackView stackViewWithViews:_countViewArray];

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

(
    (
    "<NSView: 0x600000121ea0>"
),
    (
    "<NSView: 0x600000120780>"
,
    (
    "<NSView: 0x6000001235a0>"
)
)

Как я могу решить?


person Joannes    schedule 07.03.2017    source источник


Ответы (1)


Проблема в том, что вы добавляете массивы (содержащие одно представление) вместо представлений...

Помните, что @[x] — это буквальное выражение, определяющее NSArray, содержащее x.


Итак, такая строка:

[_mutableCountViewArray addObject:@[self.a.view]];

должно стать:

[_mutableCountViewArray addObject:self.a.view];

(конечно, это относится к каждому объекту, который вы добавите в следующих нескольких строках...)


Кроме того, в качестве примечания:

_countViewArray = [[NSArray alloc] init];

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

person Alladinian    schedule 07.03.2017
comment
Эй, спасибо! Не понимаю смысла избыточности. Первый блок кода без изменяемого массива, второй блок массива понимается... - person Joannes; 07.03.2017
comment
@alfioal Я имею в виду, что вы можете безопасно удалить строку _countViewArray = [[NSArray alloc] init]; (в случае, если вы используете первый фрагмент), поскольку вы снова присваиваете другое значение _countViewArray в следующей строке ... Надеюсь, это имеет смысл :) - person Alladinian; 07.03.2017
comment
Ах хорошо! Я понимаю! - person Joannes; 07.03.2017