iPhone: UITableView CellAccessory Галочка - PullRequest
37 голосов
/ 11 мая 2011

В приложении для iPhone по нажатию на ячейку табличного представления. Я хочу отобразить ячейку табличного представления. Тип аксессуара. Установите флажок для этого на didSelectRowAtIndexPath. Я пишу код

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

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

Как мне этого добиться?

Ответы [ 8 ]

169 голосов
/ 11 мая 2011

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

Вот более подробно.Сначала добавьте свойство, чтобы отслеживать текущую проверенную строку.Проще всего, если это 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;
    }
}
5 голосов
/ 11 мая 2011
- (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 голосов
/ 28 сентября 2011

это простое решение, которое сработало для меня:

в вашем файле .h объявите:

NSIndexPath *checkedCell;

затем в вашем файле .m добавьте:

        if (checkedCell == indexPath) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
        } else { 
cell.accessoryType = UITableViewCellAccessoryNone; 
}

для cellForRowAtIndexPath и

checkedCell = indexPath;
[tableView reloadData]

для метода didSelectRowAtIndexPath .

Удачи!

2 голосов
/ 18 января 2012

просто

в .ч

NSIndexPath   checkedCell;

дюйм. М

cellForRowAtIndexPath


if ([checkedCell isEqual:indexPath]) 

{
    cell.accessoryType = UITableViewCellAccessoryCheckmark;


} else
{ 
    cell.accessoryType = UITableViewCellAccessoryNone; 
}

в didSelectRowAtIndexPath

checkedCell = indexPath;

[tableView reloadData]
2 голосов
/ 11 мая 2011

Я работал над вашей проблемой и получил решение

в .h файле

int rowNO;
    NSIndexPath *lastIndexPth;

в.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;
    }

Надеюсь, это поможет вам ...

1 голос
/ 18 апреля 2013

Я надеюсь, что это решит вашу проблему:

- (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];
}
1 голос
/ 11 мая 2011

Добавьте к вашей UITableViewDataSource переменную делегата NSIndexPath *checkedIndex. Добавить к didSelectRowAtIndexPath:

checkedIndex = indexPath;
[tableView reload];

И измените свой cellForRowAtIndexPath: метод:

cell = .. // init or dequeue
if ([indexPath isEqualTo:checkedIndex])
{
    cell.accessoryType=UITableViewCellAccessoryCheckmark;
}
else
{
    cell.accessoryType=UITableViewCellAccessoryNone;
}
1 голос
/ 11 мая 2011

Вы можете сохранить NSIndexPath проверенной строки в качестве переменной класса, когда вы пытаетесь открыть для другой строки просто доступ к ранее проверенной строке, используя переменную NSIndexPath, сохраненную как переменную класса, и снимите флажок.

Проверьте ниже сообщение

http://www.iphonedevsdk.com/forum/iphone-sdk-development/24240-uitableviewcellaccessorycheckmark-one-checkmark-time.html

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