UITableViewCell的accessoryType屬性

使用的話,例如:app

cell.accessoryType = UITableViewCellAccessoryNone;//cell沒有任何的樣式  框架

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;//cell的右邊有一個小箭頭,距離右邊有十幾像素;  ide

cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;//cell右邊有一個藍色的圓形button;  spa

cell.accessoryType = UITableViewCellAccessoryCheckmark;//cell右邊的形狀是對號;  
orm


對於 UITableViewCell 而言,其 accessoryType屬性有4種取值:
對象

UITableViewCellAccessoryNone,索引

UITableViewCellAccessoryDisclosureIndicator,事件

UITableViewCellAccessoryDetailDisclosureButton,get

UITableViewCellAccessoryCheckmarkit

分別顯示 UITableViewCell 附加按鈕的4種樣式:

 無、

 

除此以外,若是你想使用自定義附件按鈕的其餘樣式,必需使用UITableView 的 accessoryView 屬性。好比,咱們想自定義一個 

的附件按鈕,你能夠這樣作:

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:imageforState: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 對象,咱們也能夠得到每一個觸摸在視圖中的位置:

// 檢查用戶點擊按鈕時的位置,並轉發事件到對應的accessorytapped事件

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

{

NSSet *touches =[event allTouches];

UITouch *touch =[touches anyObject];

CGPointcurrentTouchPosition = [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;

//在這裏加入本身的邏輯

⋯⋯

}

相關文章
相關標籤/搜索