草庐IT

iphone - 选择表格 View 部分时如何设置复选框图像?

coder 2024-01-20 原文

我正在做一个项目,我卡在了一个点上。单击单元格 TableView 后,我的项目有一个包含一些数据的 TableView ,该 View 将扩展为多个部分。一切都很好,除了一件事,即我想设置一个复选框图像(当用户单击一个单元格时)。 当我点击单元格时,它会提供单元格标题文本,但我无法在特定单元格部分设置复选框图像(如 UITableViewCellAccessoryCheckmark)。

我在下面发布图片和代码:!

MyTableView 它包含根练习名称

这是扩展 View ,我想在单元格的右侧有一个复选框(UITableViewCellAccessoryCheckmark)。

当我点击 tableView didSelectRowAtIndexPath: 时它工作正常

//代码

     -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0) {
        if ([indexPath isEqual:self.selectIndex]) {
            self.isOpen = NO;
            [self didSelectCellRowFirstDo:NO nextDo:NO];
            self.selectIndex = nil;

        }else
        {
            if (!self.selectIndex) {
                self.selectIndex = indexPath;
                [self didSelectCellRowFirstDo:YES nextDo:NO];

            }else
            {

                [self didSelectCellRowFirstDo:NO nextDo:YES];
            }
        }

    }else
    {
        NSDictionary *dic = [dataList objectAtIndex:indexPath.section];
        NSArray *list = [dic objectForKey:@"ExcerciseList"];            //from plist
        NSString *item = [list objectAtIndex:indexPath.row-1];
        UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];
        if (thisCell.accessoryType == UITableViewCellAccessoryNone)
        {
            thisCell.accessoryType = UITableViewCellAccessoryCheckmark;

        }
        else
        {
            thisCell.accessoryType = UITableViewCellAccessoryNone;
        }

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:item message:nil delegate:nil cancelButtonTitle:@"ok" otherButtonTitles: nil] ;
        [alert show];
    }
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}


   #pragma mark- Table View DataSource and Delegates
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (self.isOpen&&self.selectIndex.section == indexPath.section&&indexPath.row!=0) {
        static NSString *CellIdentifier = @"Cell1";
        _cell = (Cell1*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (!_cell) {
            _cell = [[[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil] objectAtIndex:0];

            //[[[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil] objectAtIndex:0];
        }
        NSArray *list = [[dataList objectAtIndex:self.selectIndex.section] objectForKey:@"ExcerciseList"];
        _cell.titleLabel.text = [list objectAtIndex:indexPath.row-1];

        //[_cell changecheckboxWithUp:([self.selectIndex isEqual:indexPath]?YES:NO)];
        return _cell;
    }
    else
    {

        static NSString *CellIdentifier = @"view_TableView_List";
        cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (!cell) {
            cell=[[CustomCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        }
        NSString *name = [[dataList objectAtIndex:indexPath.section] objectForKey:@"Excercise_Name"];
        cell.Lbl_Excercise_Name.text = name;
        cell.Lbl_Excercise_Name.font=[UIFont fontWithName:@"Hustlers Rough Demo" size:40.0f];
        NSString *ImageName=[[dataList objectAtIndex:indexPath.section] objectForKey:@"Excercise_Image"];
        [cell.imageView_Excercise_Image setImage:[UIImage imageNamed:ImageName]];
        [cell changeArrowWithUp:([self.selectIndex isEqual:indexPath]?YES:NO)];
        return cell;
    }
}

我的问题是如何在所选部分显示复选框?

对不起!如果格式不正确(新堆栈)! 谢谢你!

最佳答案

我终于能够让它工作了。以下是您必须更改的内容:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (self.isOpen&&self.selectIndex.section == indexPath.section&&indexPath.row!=0) {
        static NSString *CellIdentifier = @"Cell1";
        _cell = (Cell1*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (!_cell) {
            _cell = [[[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil] objectAtIndex:0];

            //[[[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil] objectAtIndex:0];
        }
        NSArray *list = [[dataList objectAtIndex:self.selectIndex.section] objectForKey:@"ExcerciseList"];
        _cell.titleLabel.text = [list objectAtIndex:indexPath.row-1];
        _cell.accessoryView = nil;
        if ([self.selectedCells containsObject:indexPath])
        {
            _cell.accessoryView = [[UIImageView alloc] initWithImage:
                               [UIImage imageNamed:@"check_box@2x.png"]];
        }
        //[_cell changecheckboxWithUp:([self.selectIndex isEqual:indexPath]?YES:NO)];
        return _cell;
    }
    else
    {

        static NSString *CellIdentifier = @"view_TableView_List";
        cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (!cell) {
            cell=[[CustomCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        }
        NSString *name = [[dataList objectAtIndex:indexPath.section] objectForKey:@"Excercise_Name"];
        cell.Lbl_Excercise_Name.text = name;
        cell.Lbl_Excercise_Name.font=[UIFont fontWithName:@"Hustlers Rough Demo" size:40.0f];
        NSString *ImageName=[[dataList objectAtIndex:indexPath.section] objectForKey:@"Excercise_Image"];
        [cell.imageView_Excercise_Image setImage:[UIImage imageNamed:ImageName]];
        [cell changeArrowWithUp:([self.selectIndex isEqual:indexPath]?YES:NO)];
        return cell;
    }
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0) {
        if ([indexPath isEqual:self.selectIndex]) {
            self.isOpen = NO;
            [self didSelectCellRowFirstDo:NO nextDo:NO];
            self.selectIndex = nil;

        }else
        {
            if (!self.selectIndex) {
                self.selectIndex = indexPath;
                [self didSelectCellRowFirstDo:YES nextDo:NO];

            }else
            {

                [self didSelectCellRowFirstDo:NO nextDo:YES];
            }
        }

    }else
    { 

        NSDictionary *dic = [dataList objectAtIndex:indexPath.section];
        NSArray *list = [dic objectForKey:@"ExcerciseList"];
        NSString *item = [list objectAtIndex:indexPath.row-1];
        UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];
        if (!thisCell.accessoryView)
        {
            [self.selectedCells addObject:indexPath];
            thisCell.accessoryView = [[UIImageView alloc] initWithImage:
                                  [UIImage imageNamed:@"check_box@2x.png"]];

        }
        else
        {
            [self.selectedCells removeObject:indexPath];
            thisCell.accessoryView = nil;
        }

//        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:item message:nil delegate:nil cancelButtonTitle:@"ok" otherButtonTitles: nil] ;
//        [alert show];
    }
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

}

如果这些方法没有任何其他变化,只需复制粘贴代码即可。我在发布之前对其进行了测试。如果您有更多问题,请告诉我

更新

这是对发生的事情的解释。实际上有几个问题:

首先,您混合了 accessoryTypeaccessoryView;这导致了 if-else 子句的执行不正确。这是旧代码

// here you are using accessoryType
if (thisCell.accessoryType == UITableViewCellAccessoryNone)
{
    // but here you're using accessoryView
    thisCell.accessoryView = [[UIImageView alloc] initWithImage:
                              [UIImage imageNamed:@"check_box@2x.png"]];

}
else
{
    // here too...
    thisCell.accessoryView=nil;
    thisCell.accessoryView = nil;
}

其次,您没有保存所选元素的索引路径。这是更正后的代码(注意是相同的 if-else 子句):

if (!thisCell.accessoryView)
{
    // you have to save the selected indexPaths
    [self.selectedCells addObject:indexPath];
    thisCell.accessoryView = [[UIImageView alloc] initWithImage:
                              [UIImage imageNamed:@"check_box@2x.png"]];

}
else
{
    // if the cell was already selected, then remove the indexPath
    [self.selectedCells removeObject:indexPath];
    thisCell.accessoryView = nil;
}

第三,cellForRowAtIndexPath... 中的以下行搞砸了,因为它显示了另一个复选标记,所以我将其删除:

[_cell.checkUnCheck_ImageView setHidden:NO];

差不多就是这样。

希望这对您有所帮助!

关于iphone - 选择表格 View 部分时如何设置复选框图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19031062/

有关iphone - 选择表格 View 部分时如何设置复选框图像?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  4. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  5. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  6. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  7. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  8. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  9. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  10. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

随机推荐