2014-11-16 41 views
0

我只是想知道爲什麼UIButton的發件人不是唯一的或不斷變化的。我有一個充滿活力的tableview(大約100行),每個單元格中都有一個按鈕。所有按鈕都具有動態的標籤ID。在點擊事件功能,我想改變按鈕,做一些其他的東西。Xcode6 swift UIButton發件人不是唯一的嗎?

如果我使用按鈕發件人標識例如改變顏色也會改變列表中的另一個按鈕。

似乎發送者在滾動時正在改變。奇怪。

對不起,很愚蠢。我認爲有一些明顯的東西我錯過了。

func followButtonTapped(sender: UIButton) { 
    println(sender) 
    println("UserID: \(sender.tag)") 
    sender.enabled = false 
    sender.backgroundColor = UIColor.grayColor() 
    sender.setTitle("...", forState: UIControlState.Normal) 
} 

下面的示例發件人:

<UIButton: 0x7fe5249bacd0; frame = (297 17; 63 24); opaque = NO; autoresize = RM+BM; tag = 1147; layer = <CALayer: 0x7fe5249c2b10>> 
UserID: 1147 

這裏我的cellForRowAtIndexPath

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ 

    tableView.tableFooterView = UIView(frame: CGRectZero) 
    tableView.estimatedRowHeight = 58 

    var cell : followCell! = tableView.dequeueReusableCellWithIdentifier(followCellIdentifier) as followCell! 

    if(cell == nil){ 
     cell = NSBundle.mainBundle().loadNibNamed(followCellIdentifier, owner: self, options: nil)[0] as followCell; 
    } 

    cell?.followName?.text=self.maintext[indexPath.row] 
    cell?.followSubtext?.text = self.subtext[indexPath.row] 
    cell?.followButton?.addTarget(self, action: "followButtonTapped:", forControlEvents: .TouchUpInside) 
    cell?.followButton?.tag = self.UserIds[indexPath.row].toInt()! 

    var image = UIImage(named: "default_avatar_40.jpg") 

    var imgURL: NSURL = NSURL(string: self.images[indexPath.row])! 
    let request: NSURLRequest = NSURLRequest(URL: imgURL) 
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!,data: NSData!,error: NSError!) -> Void in 
     if error == nil { 
      var image = UIImage(data: data) 

      if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) as? followCell { 
       cellToUpdate.followImage.image = image 
      } 
     } 
    }) 

    cell?.backgroundColor = UIColor.clearColor() 

    return cell as followCell 
} 

回答

1

我相信你所觀察的行爲是由於細胞的tableView的重用。當您觸摸某個按鈕然後更改其顏色時,包含該按鈕的單元格僅與該表格行關聯,直到它滾動屏幕。單元格(和按鈕)將被重新用於屏幕上的另一行。如果您沒有將顏色設置回cellForRowAtIndexPath,屏幕上顯示的單元格可能會顯示已選中的已用按鈕。

爲了使這項工作,你需要做三兩件事:

按鈕
  1. 獨立,則需要跟蹤哪些按鈕都在你的模型被按下。例如,在您的視圖控制器類中,有一個布爾值數組,其中每個按鈕都有一個條目。

    var selected:[Bool] = Array(count: 100, repeatedValue: false) 
    
  2. cellForRowAtIndexPath,建立了基於你的模型中的布爾值的數組的按鈕。

    要知道哪一行的按鈕相關聯,可以在cellForRowAtIndexPath按鈕的標籤設置爲indexPath.row,然後訪問sender.tagfollowButtonTapped

    cell.button.tag = indexPath.row 
    if selected[indexPath.row] { 
        cell.button.enabled = false 
        cell.button.backgroundColor = UIColor.grayColor() 
    } else { 
        cell.button.enabled = true 
        cell.button.backgroundColor = UIColor.whiteColor() 
    } 
    
  3. followButtonTapped變化對應於您選擇按鈕陣列中的布爾值。

    func followButtonTapped(sender: UIButton) { 
        let row = sender.tag 
        selected[row] = true 
        println(sender) 
        println("UserID: \(sender.tag)") 
        sender.enabled = false 
        sender.backgroundColor = UIColor.grayColor() 
        sender.setTitle("...", forState: UIControlState.Normal) 
    } 
    
+0

感謝@vacawama您的快速回復,但我沒有得到這個工作。有沒有辦法操縱細胞標識符?我剛剛添加了我的cellForRowAtIndexPath – Norman

+0

您的表格可能有100個行,但只會分配大約8個單元格。當他們從屏幕上滾動時,他們被放入重用隊列並重新使用。你不應該依賴單元來保存任何狀態數據。任何狀態都應該在表格單元外部進行。這正是我試圖用'selected'數組提出的建議。 – vacawama

相關問題