IPhone: UITableView CellAccessory Checkmark
В приложении iPhone при щелчке по ячейке просмотра таблицы я хочу отобразить ячейку вида таблицы Тип аксессуара Отметьте для этого на didSelectRowAtIndexPath я пишу код
if(indexPath.row ==0)
{
[tableView cellForRowAtIndexPath:indexPath].accessoryType=UITableViewCellAccessoryCheckmark;
}
и отображения контрольных меток.
но в моем случае я wnt позволяет пользователю проверять только на ячейке за раз, означает, что если пользователь выбирает другую строку, тогда эта строка должна быть проверена и ранее проверена, должна быть снята флажка
Как я могу это достичь?
Ответы
Ответ 1
Следить, в переменной экземпляра, из какой строки проверяется.
Когда пользователь выбирает новую строку, сначала снимите флажок с ранее отмеченной строки,
затем проверьте новую строку и обновите переменную экземпляра.
Вот более подробно. Сначала добавьте свойство, чтобы отслеживать текущую строку. Это проще всего, если это NSIndexPath
.
@interface RootViewController : UITableViewController {
...
NSIndexPath* checkedIndexPath;
...
}
...
@property (nonatomic, retain) NSIndexPath* checkedIndexPath;
...
@end
В вашем cellForRowAtIndexPath
добавьте следующее:
if([self.checkedIndexPath isEqual:indexPath])
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
Как вы кодируете свой tableView:didSelectRowAtIndexPath:
, будет зависеть от поведения, которое вы хотите.
Если всегда должна быть проверена строка, то есть, если пользователь нажимает на уже проверенную строку, используйте следующее:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Uncheck the previous checked row
if(self.checkedIndexPath)
{
UITableViewCell* uncheckCell = [tableView
cellForRowAtIndexPath:self.checkedIndexPath];
uncheckCell.accessoryType = UITableViewCellAccessoryNone;
}
UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
self.checkedIndexPath = indexPath;
}
Если вы хотите, чтобы пользователь мог снять отметку с строки, нажав на нее снова, используйте этот код:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Uncheck the previous checked row
if(self.checkedIndexPath)
{
UITableViewCell* uncheckCell = [tableView
cellForRowAtIndexPath:self.checkedIndexPath];
uncheckCell.accessoryType = UITableViewCellAccessoryNone;
}
if([self.checkedIndexPath isEqual:indexPath])
{
self.checkedIndexPath = nil;
}
else
{
UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
self.checkedIndexPath = indexPath;
}
}
Ответ 2
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *newCell =[tableView cellForRowAtIndexPath:indexPath];
int newRow = [indexPath row];
int oldRow = [lastIndexPath row];
if (newRow != oldRow)
{
newCell = [tableView cellForRowAtIndexPath:indexPath];
newCell.accessoryType = UITableViewCellAccessoryCheckmark;
UITableViewCell *oldCell = [tableView cellForRowAtIndexPath: lastIndexPath];
oldCell.accessoryType = UITableViewCellAccessoryNone;
lastIndexPath = indexPath;
}
}
Для справки рассмотрите обсуждение
Ответ 3
это простое решение, которое сработало для меня:
в вашем .h файле объявить:
NSIndexPath *checkedCell;
, то в вашем файле .m добавьте:
if (checkedCell == indexPath) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
для метода cellForRowAtIndexPath и
checkedCell = indexPath;
[tableView reloadData]
для метода didSelectRowAtIndexPath.
Удачи!
Ответ 4
Я работал над вашей проблемой и получил решение
в .h файле
int rowNO;
NSIndexPath *lastIndexPth;
in. m file
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"%d",indexPath.row);
if (rowNO!=indexPath.row) {
rowNO=indexPath.row;
[tableView cellForRowAtIndexPath:indexPath].accessoryType=UITableViewCellAccessoryCheckmark;
[tableView cellForRowAtIndexPath:lastIndexPth].accessoryType=UITableViewCellAccessoryNone;
lastIndexPth=indexPath;
}
Надеюсь, это поможет вам...
Ответ 5
его простой
в .h
NSIndexPath checkedCell;
В .m
cellForRowAtIndexPath
if ([checkedCell isEqual:indexPath])
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
в
didSelectRowAtIndexPath
checkedCell = indexPath;
[tableView reloadData]
Ответ 6
Вы можете хранить NSIndexPath
проверенной строки как переменную класса, всякий раз, когда вы пытаетесь выполнить следующую строку, просто обращайтесь к ранее проверенной строке, используя переменную NSIndexPath
, хранящуюся как переменную класса, и не отмеченную.
Проверьте приведенный ниже пост
http://www.iphonedevsdk.com/forum/iphone-sdk-development/24240-uitableviewcellaccessorycheckmark-one-checkmark-time.html
Ответ 7
Добавьте к своей переменной UITableViewDataSource
делегат NSIndexPath *checkedIndex
. Добавить в didSelectRowAtIndexPath:
checkedIndex = indexPath;
[tableView reload];
И измените свой метод cellForRowAtIndexPath:
:
cell = .. // init or dequeue
if ([indexPath isEqualTo:checkedIndex])
{
cell.accessoryType=UITableViewCellAccessoryCheckmark;
}
else
{
cell.accessoryType=UITableViewCellAccessoryNone;
}
Ответ 8
Я надеюсь, что это решает вашу проблему:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
int newRow = [indexPath row];
int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;
if (newRow != oldRow)
{
UITableViewCell *newCell = [tableView cellForRowAtIndexPath:
indexPath];
newCell.accessoryType = UITableViewCellAccessoryCheckmark;
UITableViewCell *oldCell = [tableView cellForRowAtIndexPath:
lastIndexPath];
oldCell.accessoryType = UITableViewCellAccessoryNone;
lastIndexPath = indexPath;
}
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}