Подтвердить что ты не робот

IPhone: UITableView CellAccessory Checkmark

В приложении iPhone при щелчке по ячейке просмотра таблицы я хочу отобразить ячейку вида таблицы Тип аксессуара Отметьте для этого на didSelectRowAtIndexPath я пишу код

if(indexPath.row ==0)
{
[tableView cellForRowAtIndexPath:indexPath].accessoryType=UITableViewCellAccessoryCheckmark;
 }

и отображения контрольных меток.

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

Как я могу это достичь?

4b9b3361

Ответ 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];
}