Вопрос о назначении свойств - PullRequest
0 голосов
/ 13 апреля 2011

Редактировать 2: То, что я планировал ранее, было, вероятно, плохой идеей, и теперь я изменил свой дизайн: мой UITableViewController имеет массив со всеми значениями моих UITextField с, и я использую делегирование обновить значения в массиве. (Если значение в одном UITableViewCell изменяется, я отправляю сообщение с новым значением и индексом ячейки).


Оригинальный вопрос

Я хотел бы создать подкласс UITableViewCell. Чтобы получить доступ к моим ячейкам, я хотел бы иметь NSMutableArray в моем UITableViewController со всеми ячейками. Всякий раз, когда я создаю новую ячейку в - tableView:cellForRowAtIndexPath:, я добавляю ее в массив. Однако клетки должны знать об этом массиве. Я бы объявил такое свойство для UITableViewCell:

@property (nonatomic, assign) NSMutableArray *cellsArray;

Всякий раз, когда я создаю новую ячейку, я устанавливаю ее cellsArray для моего массива.

Мой (возможно, простой) вопрос: верно ли, что cellsArray будет содержать указатель на массив в UITableViewController, и когда я добавлю материал в массив UITableViewController, ячейки тоже узнают об этом т.е. может получить к нему доступ?

Редактировать: В UITableViewCell с UITextField с. Раньше я полагался на метод -cellForRowAtIndexPath: и массив visibleCells, однако, когда ячейки выходили из поля зрения, содержимое их UITextFields также терялось. Затем я решил хранить ячейки в массиве. Когда пользователь нажимает сохранить, я перебираю массив и сохраняю значения. Кроме того, я хотел бы автоматически обновить свойство enabled кнопки сохранения, в зависимости от того, содержат ли все ячейки что-то - для этого мне также нужны все ячейки.

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

Если есть лучшие подходы к этому, я рад слышать о них!

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

Не прямой ответ на ваш вопрос, но это звучит как очень плохой дизайн. Почему одна клетка должна знать о своих братьях и сестрах? Любое событие / изменение, которое происходит в одной ячейке и оказывает влияние на другие ячейки, должно обрабатываться контроллером табличного представления. Отдельные ячейки должны быть отдельными объектами, которые не должны знать о состоянии друг друга.

Во-вторых, нет необходимости вводить другой массив для управления ячейками таблицы. В табличном представлении уже есть свойство visibleCells, к которому вы можете обращаться из контроллера табличного представления. И никогда не должно взаимодействовать с невидимыми ячейками, так как они управляются табличным представлением и его средством повторного использования.

1 голос
/ 13 апреля 2011

Я полагаю, что ответ - Да.

Насколько я понимаю, assign состоит в том, что вы можете присвоить значение такой переменной, и счет сохранения для исходного объекта не увеличивается.Точно так же вам не нужно освобождать переменную в методе dealloc объекта.Однако вы можете рискнуть тем, что исходный массив исчезнет, ​​а затем cellsArray будет указывать на то, чего больше нет.

Я использую assign, когда хочу передать ссылку на объектдругому объекту (например, контроллеру представления, который будет отображать или иным образом манипулировать объектом).И в последнем объекте я не освобождаю его указатель на объект.

Вы также видите assign, используемый со свойствами, которые id, как

@property (nonatomic, assign) id<SomeProtocol> _myDelegate;

Всепри этом, за исключением случая id, я часто чувствую себя "безопаснее", используя retain для свойства и обязательно выпуская в dealloc.: -)

Во всяком случае, я думаю, в этом суть разницы.

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