zoukankan      html  css  js  c++  java
  • 自定义 UITableViewCell 的 accessory 样式

    对于 UITableViewCell 而言,其 accessoryType 属性有4种取值:

    UITableViewCellAccessoryNone ,

    UITableViewCellAccessoryDisclosureIndicator ,

    UITableViewCellAccessoryDetailDisclosureButton ,

    UITableViewCellAccessoryCheckmark

    分别显示 UITableViewCell 附加按钮的4种样式:

      无、

     

    除此之外,如果你想使用自定义附件按钮的其他样式,必需使用 UITableView 的 accessoryType 属性。比如,我们想自定义一个  

    的附件按钮,你可以这样做:

    UIButton *button ;

    if ( isEditableOrNot ){

    UIImage *image= [ UIImage    imageNamed : @"delete.png" ];

    button = [ UIButton buttonWithType : UIButtonTypeCustom ];

    CGRect frame = CGRectMake ( 0.0 , 0.0 , image. size . width , image. size . height );

    button. frame = frame;

    [button setBackgroundImage :image forState : UIControlStateNormal ];

    button. backgroundColor = [ UIColor clearColor ];

    cell. accessoryView = button;

    } else {

    button = [ UIButton buttonWithType : UIButtonTypeCustom ];

    button. backgroundColor = [ UIColor clearColor ];

    cell. accessoryView = button;

    }

    这样,当 isEditableOrNot 变量为 YES 时,显示如下视图:

     

    但仍然还存在一个问题,附件按钮的事件不可用。即事件无法传递到 UITableViewDelegate accessoryButtonTappedForRowWithIndexPath 方法。

    也许你会说,我们可以给 UIButton 加上一个 target。

    好,让我们来看看行不行。在上面的代码中加入:

    [button addTarget : self action : @selector ( btnClicked : event :)   forControlEvents : UIControlEventTouchUpInside ];

    然后实现btnClicked方法,随便在其中添加点什么。

    点击每个 UIButton,btnClicked 方法中的代码被调用了!一切都是那么完美。

    但问题在于,每个 UITableViewCell 都有一个附件按钮,在点击某个按钮时,我们无法知道到底是哪一个按钮发生了点击动作!因为 addTarget 方法无法让我们传递一个区别按钮们的参数,比如 indexPath.row 或者别的什么对象。addTarget 方法最多允许传递两个参数:target 和 event,而我们确实也这么做了。但这两个参数都有各自的用途,target 指向事件委托对象——这里我们把 self 即 UIViewController 实例传递给它,event 指向所发生的事件比如一个单独的触摸或多个触摸。我们需要额外的参数来传递按钮所属的 UITableViewCell 或者行索引,但很遗憾,只依靠 Cocoa 框架,我们无法做到。

    但我们可以利用 event 参数,在 btnClicked 方法中判断出事件发生在UITableView 的哪一个 cell 上。因为 UITableView 有一个很关键的方法 indexPathForRowAtPoint ,可以根据触摸发生的位置,返回触摸发生在哪一个 cell 的indexPath。 而且通过 event 对象,我们也可以获得每个触摸在视图中的位置:

    // 检查用户点击按钮时的位置,并转发事件到对应的 accessory tapped 事件

    - ( void )btnClicked:( id )sender event:( id )event

    {

    NSSet *touches = [event allTouches ];

    UITouch *touch = [touches anyObject ];

    CGPoint currentTouchPosition = [touch locationInView : self . tableView ];

    NSIndexPath *indexPath = [ self . tableView indexPathForRowAtPoint : currentTouchPosition];

    if (indexPath != nil )

    {

    [ self tableView : self . tableView accessoryButtonTappedForRowWithIndexPath : indexPath];

    }

    }

    这样,UITableView的accessoryButtonTappedForRowWithIndexPath方法会被触发,并且获得一个 indexPath 参数。通过这个indexPath 参数,我们可以区分到底是众多按钮中的哪一个附件按钮发生了触摸事件:

    -( void )tableView:( UITableView *) tableView accessoryButtonTappedForRowWithIndexPath:( NSIndexPath *)indexPath{

    int * idx= indexPath. row ;

    // 在这里加入自己的逻辑

    ⋯⋯

    }

  • 相关阅读:
    jquery 实现 返回顶部
    js 10秒倒计时 功能
    2019.6.10 工作日志
    2019.4.25 工作日志
    2019.4.22 工作日志
    2019.4.13 工作日志
    2019.3.12 工作日志
    2019.1.22 工作日志
    2019.1.18 工作日志
    2019.1.14 工作日志
  • 原文地址:https://www.cnblogs.com/encounter/p/2188488.html
Copyright © 2011-2022 走看看